参考: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
}