如何使用 Diesel 和 SQLite 获取新创建值的 id?
Posted
技术标签:
【中文标题】如何使用 Diesel 和 SQLite 获取新创建值的 id?【英文标题】:How to get the id of a newly-created value with Diesel and SQLite? 【发布时间】:2021-05-21 15:07:45 【问题描述】:Diesel 的 SqliteBackend
没有实现 SupportsReturningClause
特征,因此不能使用 get_result
方法来检索新创建的值。
还有其他方法可以找出插入行的 id 吗? Python has a solution for this。到目前为止,我发现的唯一解决方案是使用 UUID 作为 id 而不是自动增量字段。
【问题讨论】:
这个问题按照目前的措辞没有多大意义,因为它缺少几乎所有相关信息,例如您尝试过的代码和使用的依赖版本。此外,柴油中没有SqlBackend
,因此不清楚您要做什么。如果 OP 没有改进这个问题,我投票赞成关闭这个问题。
@weiznich 是的,错过了后端名称中的“lite”。固定在问题中。至于其他问题:所有依赖项都是最新版本。我已经尝试了 get_result
方法(如问题中所述),但它不起作用,我不知道是否还有其他方法可以尝试。这就是我发布问题的原因:-)
【参考方案1】:
这里的根本问题是 SQLite
不支持 SQL RETURNING
子句,它允许您在插入语句中返回自动生成的 ID。
由于 OP 只提供了一个一般性问题,我无法展示如何使用柴油实现该问题的示例。
有几种方法可以解决此问题。所有这些都要求您执行第二个查询。
按 id 排序并选择最大的 id。这是最直接的解决方案。它直接显示了执行第二次查询的问题,因为可能在任何时间点都存在赛车插入,因此您可以取回错误的 id(至少在您不使用事务的情况下)。
使用last_insert_rowid()
SQL 函数接收最后插入的列的行ID。如果未配置,否则这些行 id 匹配您的自动增量主整数键。在柴油方面,您可以使用 no_arg_sql_function!()
在您的 crate 中定义底层 sql 函数。
【讨论】:
谢谢,这正是我需要知道的。以上是关于如何使用 Diesel 和 SQLite 获取新创建值的 id?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 NixOS 和 cargo 下安装具有 sqlite 支持的diesel-cli?