参考:https://blog.csdn.net/hsd2012/article/details/51464409
在rust的持久层框架diesel中,insert操作仅支持postgres, 会返回id. 对于 mysql 与 sqlite都不支持。
所以我们需要用对应的办法。
使用 last_insert_id 是可以的。 在高并发操作下是准确的。
查询和插入所使用的Connection对象必须是同一个才可以,否则返回值是不可预料的
下面是 翱翔同学提供的例子: ( rust 例子)
async fn create_user( db_pool: &MySqlPool, name: &str, datetime: chrono::NaiveDateTime, ) -> u32 { // BEGIN transaction let mut transaction = db_pool.begin().await.unwrap(); mysql::query( "INSERT INTO users \ (name, created_at, updated_at) \ VALUES (?, ?, ?);", ) .bind(name) .bind(datetime) .bind(datetime) .execute(&mut transaction) .await .unwrap(); // COMMIT transaction // 获取刚刚在事务处理中创建了user的MySqlConnection let mut db_conn = transaction.commit().await.unwrap(); let last_insert_user_id = sqlx::query_as::<_, (u32,)>("SELECT LAST_INSERT_ID();") .fetch_one(&mut db_conn) .await .unwrap() .0; // 这里已经在函数的结尾处了,就懒得手动释放内存了 // drop(db_conn); debug_assert_ne!(last_insert_user_id, 0); last_insert_user_id }