【问题标题】:How to get the id of a newly-created value with Diesel and SQLite?如何使用 Diesel 和 SQLite 获取新创建值的 id?
【发布时间】: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 方法(如问题中所述),但它不起作用,我不知道是否还有其他方法可以尝试。这就是我发布问题的原因:-)

标签: sqlite rust rust-diesel


【解决方案1】:

这里的根本问题是 SQLite 不支持 SQL RETURNING 子句,它允许您在插入语句中返回自动生成的 ID。

由于 OP 只提供了一个一般性问题,我无法展示如何使用柴油实现该问题的示例。

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

  1. 按 id 排序并选择最大的 id。这是最直接的解决方案。它直接显示了执行第二次查询的问题,因为可能在任何时间点都存在赛车插入,因此您可以取回错误的 id(至少在您不使用事务的情况下)。

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

【讨论】:

  • 谢谢,这正是我需要知道的。
猜你喜欢
  • 2020-05-19
  • 2019-11-02
  • 2020-09-07
  • 1970-01-01
  • 2012-06-27
  • 2015-07-16
  • 2022-01-20
  • 1970-01-01
相关资源
最近更新 更多