我有一個模型,用pg
gem將數據直接加載到數據庫。在to_csv
實例方法序列「setval」操作與Postgres在Rails中的「nextval」不一樣3.2.16
self.class.select("nextval('apps_id_seq'::regclass)").first['nextval']
:這是通過動態創建一個CSV文件,並指派值到id
場致電。
這在生產中很有效。但是,我正在填寫一些測試,如果這個測試是首先運行的,或者它本身運行,那麼它會失敗,因爲DB剛剛被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)")
也不及其作品的任意組合,它只是refuses
工作。我不知道這是不是一個pg
寶石問題。
UPDATE
這些陳述中development
模式下工作:
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
文件創建的。
在更新您的問題時,您會說'這些陳述可以在測試模式下工作'。我不清楚究竟是什麼不工作使用'''ActiveRecord :: Base.connection.execute()''' –
我昨天必須轉過身來。您的回答是正確的,感謝您的幫助。正在運行: ActiveRecord :: Base.connection.execute運行''''setval'''如果App.count == 0 修復了這個問題。 – AKWF