如何使用 Diesel 和 SQLite 获取新创建值的 id?

Max*_*nko 7 sqlite rust rust-diesel

DieselSqliteBackend没有实现该SupportsReturningClause特征,因此该get_result方法不能用于检索新创建的值。

还有其他方法可以找出插入行的 id 吗?Python对此有一个解决方案。到目前为止我找到的唯一解决方案是使用 UUID 作为 ids 而不是自动增量字段。

wei*_*ich 9

这里的根本问题是SQLite不支持 SQLRETURNING子句,该子句允许您返回自动生成的 id 作为插入语句的一部分。

由于OP仅提供了一个一般性问题,我无法举例说明如何使用柴油来实现该问题。

有多种方法可以解决此问题。所有这些都要求您执行第二个查询。

  1. 按 id 排序并仅选择最大的 id。这是最直接的解决办法。它直接显示了执行第二次查询的问题,因为在任何时间点都可能存在竞争插入,这样您就可以返回错误的 id(至少如果您不使用事务)。

  2. 使用last_insert_rowid()SQL函数接收最后插入列的行 ID。如果没有配置,否则这些行 ID 与您的自动增量主整数键匹配。在柴油机方面,您可以使用它no_arg_sql_function!()来定义板条箱中的底层 sql 函数。

  • 只是在答案 1.5 年后更新,SQLite 从 3.35 版本开始支持 RETURNING。此外,Diesel `2.0.0-rc.0` 通过功能标志支持 SQLite 中的 RETURNING 子句。 (7认同)