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

Posted

技术标签:

【中文标题】如何使用 Diesel 和 SQLite 获取新创建值的 id?【英文标题】:How to get the id of a newly-created value with Diesel and SQLite? 【发布时间】:2021-04-02 19:51:53 【问题描述】:

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?

如何使用 Diesel 将 i64 与 Insertable 一起使用

Diesel 获取单亲和许多孩子 - 火箭

遵循“入门”柴油教程,但使用 sqlite,原因

如何使用柴油在 sqlite 中进行 upsert?

Rust Diesel 未构建错误使用未声明的板条箱或模块