gpt4 book ai didi

ruby-on-rails-3 - 序列 "setval"操作与 Postgres in Rails 3.2.16 的 "nextval"不同

转载 作者:行者123 更新时间:2023-11-29 12:13:04 27 4
gpt4 key购买 nike

我有一个使用 pg gem 将数据直接加载到数据库的模型。它通过动态创建 CSV 文件并通过调用将值分配给 id 字段来实现:

self.class.select("nextval('apps_id_seq'::regclass)").first['nextval']

to_csv 实例方法中。

这在生产中效果很好。但是,我正在填写一些测试,如果这个测试首先运行,或者它自己运行,它会失败,因为数据库刚刚被 Database Cleaner gem 和序列重置被重置。但它们没有给出起始值。

Postgres 文档说您可以对有问题的序列调用 setval 来设置它。假设我想将它设置为从 1 开始,以便下次调用 nextval 时,它将返回 1:

select setval('apps_id_seq'::regclass, 1, false);

但我不能像上面调用 nextval 那样调用它,因为它根本不起作用。它返回 nil,并且不设置序列。

我尝试的任何事情都没有迭代:

self.class.select("setval('apps_id_seq'::regclass)").first
App.connection.execute("select setval('apps_id_seq'::regclass,1,false)")
ActiveRecord::Base.connection.execute("select setval('apps_id_seq'::regclass,1)")
ActiveRecord::Base.connection.execute("select setval('apps_id_seq'::regclass,1,false)")
ActiveRecord::Base.connection.execute("select setval('apps_id_seq'::regclass,1,false)")

它们的任何组合都不起作用,它只是拒绝起作用。不知道是不是pg gem 的问题。

更新

这些语句在开发模式下工作:

App.select("setval('apps_id_seq'::regclass,1)").first

和:

App.select("nextval('apps_id_seq'::regclass)").first

然而,它们都不能在 test 中工作。

但是,这些语句在 test 模式下确实有效:

ActiveRecord::Base.connection.execute("select setval('apps_id_seq'::regclass,1,false)").first

和:

ActiveRecord::Base.connection.execute("select nextval('apps_id_seq'::regclass)").first

据我所知,这两种环境的唯一区别是一个有数据,而另一个没有。我的测试数据库是使用 structure.sql 文件中的 rake db:test:prepare 创建的。

最佳答案

setvalnextval 将起作用,无论表中是否有序列所附加的数据。甚至可以在不关联到现有表的列的情况下创建和递增序列。当您使用 Model.select 执行原始 SQL 时,ActiveRecord 会为您正在使用的模型的表生成带有 from 子句的 SQL:

> App.select("setval('apps_id_seq'::regclass,1)").first

SELECT nextval('apps_id_seq'::regclass)
FROM "apps" ORDER BY "apps"."id" ASC LIMIT 1'

=> nil

因为 apps 表中没有记录,所以永远不会执行 setval 函数。这就是为什么在直接使用连接时相同的 select 起作用的原因,因为 select 没有无关的 from 子句:

> ActiveRecord::Base.connection.execute("SELECT setval('apps_id_seq'::regclass, 1)").first

SELECT setval('apps_id_seq'::regclass, 1)

=> {"setval"=>"1"}

使用这种形式执行 SQL 以确保始终对 setval 函数求值。

关于ruby-on-rails-3 - 序列 "setval"操作与 Postgres in Rails 3.2.16 的 "nextval"不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21146760/

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