如何使用 Diesel 和 SQLite 获取新创建的值的 id?
How to get the id of a newly-created value with Diesel and SQLite?
Diesel 的 SqliteBackend
没有实现 SupportsReturningClause
特性,因此 get_result
方法不能用于检索新创建的值。
有没有其他方法可以找出插入行的id? Python has a solution for this。到目前为止我找到的唯一解决方案是使用 UUID 作为 ID 而不是自动增量字段。
这里的根本问题是 SQLite
不支持 SQL RETURNING
子句,这些子句允许您 return 自动生成的 ID 作为插入语句的一部分.
由于 OP 只提供了一个一般性问题,我无法展示如何使用柴油实现该问题的示例。
有多种方法可以解决此问题。所有这些都需要您执行第二个查询。
按 ID 排序,select 仅按最大的 ID 排序。这是最直接的解决办法。它直接显示了进行第二次查询的问题,因为在任何时间点都可能有一个 racing insert,这样你就可以找回错误的 id(至少在你不使用事务的情况下)。
使用 last_insert_rowid()
SQL function to receive the row id of the last inserted column. If not configured otherwise those row id matches your autoincrement primary integer key. On diesel side you can use no_arg_sql_function!()
在您的 crate 中定义基础 sql 函数。
Diesel 的 SqliteBackend
没有实现 SupportsReturningClause
特性,因此 get_result
方法不能用于检索新创建的值。
有没有其他方法可以找出插入行的id? Python has a solution for this。到目前为止我找到的唯一解决方案是使用 UUID 作为 ID 而不是自动增量字段。
这里的根本问题是 SQLite
不支持 SQL RETURNING
子句,这些子句允许您 return 自动生成的 ID 作为插入语句的一部分.
由于 OP 只提供了一个一般性问题,我无法展示如何使用柴油实现该问题的示例。
有多种方法可以解决此问题。所有这些都需要您执行第二个查询。
按 ID 排序,select 仅按最大的 ID 排序。这是最直接的解决办法。它直接显示了进行第二次查询的问题,因为在任何时间点都可能有一个 racing insert,这样你就可以找回错误的 id(至少在你不使用事务的情况下)。
使用
last_insert_rowid()
SQL function to receive the row id of the last inserted column. If not configured otherwise those row id matches your autoincrement primary integer key. On diesel side you can useno_arg_sql_function!()
在您的 crate 中定义基础 sql 函数。