gpt4 book ai didi

ruby-on-rails - Rails 中的 upsert 函数是如何工作的?

转载 作者:行者123 更新时间:2023-12-03 20:13:37 26 4
gpt4 key购买 nike

由于 upsert 是 Rails 的 ActiveRecord 中实现的“较新”功能,因此它背后的文档并不多。我确实理解它背后的概念,因为它的目的是如果它是一条新记录,则插入一条新记录,如果在数据库中找到它,则更新现有记录。

例如,当我打电话时:Model.upsert(name: 'a', number: 1) , ActiveRecord 是查找名称为“a”的预先存在的记录还是编号为 1 的预先存在的记录?

例如,现在当我尝试使用 Model.upsert(name: 'a', number: 1) 更新名为 a 的模型时, 我得到一个 NotNullViolation ,因为我没有指定的 id 中有一个空值。我可以使用 upsert 更新模型而不将 id 作为参数传递吗?

最佳答案

根据目标数据库的不同,实现会有所不同。 Postgres,例如通过 INSERT...ON CONFLICT UPDATE 原生支持 upserts .您应该引用底层数据库的文档以了解详细信息。但是,一般而言,ActiveRecord 将尝试使用表上的所有唯一索引来确定现有记录是否冲突。至少这意味着您的主键,尽管它也可能意味着其他键。如果你使用的是 Postgres 或 SQLite,你可以通过 :unique_by upsert 以明确指示应使用哪些字段来确定匹配记录是否已存在( doc )。请注意,如果您使用此方法并尝试插入与未在 unique_by 中列出的唯一键上的另一记录冲突的记录。 ,您的数据库将抛出异常。

I get a NotNullViolation, because there is a null value in an id that I am not specifying.



不,当然不是 - 您必须在执行 upsert 时指定将在插入期间插入的所有字段,因为显然,如果记录不存在且必须插入,则它必须包含所有必需的字段。如果您将字段指定为非空,则当插入的值为空时,您不能尝试对它们进行 upsert!

由于您没有传递 ID,Rails 无法弄清楚如何确定记录的唯一性。它可以与您的其他字段之一上的唯一索引一起使用(假设唯一索引适合您的应用程序)。

关于ruby-on-rails - Rails 中的 upsert 函数是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58759765/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com