使用SQL序列进行的迁移不适用于测试环境

时间:2018-11-19 11:56:11

标签: ruby-on-rails

我目前正在迁移

class CreateSlugSequence < ActiveRecord::Migration[5.2]
  def up
    execute <<-SQL
      CREATE SEQUENCE slug_sequence
    SQL
  end

  def down
    execute <<-SQL
      DROP SEQUENCE slug_sequence
    SQL
  end
end

我运行rails db:migrate

进入rails c(开发模式)

运行ActiveRecord :: Base.connection.exec_query(“ select nextval('slug_sequence')”)[0] ['nextval']

并获得期望值

但是如果由于某种原因在测试模式下输入rails c,则序列表不存在

ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR:  relation "slug_sequence" does not exist

我运行了ActiveRecord::Migrator.current_version,以检查上一次应用的迁移是什么,并返回最新版本。

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

我建议删除测试数据库并重新创建它。尽管这些应该保持同步,但有时却不同步,您必须执行手动步骤才能将它们组合在一起。

RAILS_ENV=test rake db:reset

奇怪的是,它不起作用,在该任务中放置撬动调试器并查看发生了什么会很有趣。 https://github.com/rails/rails/blob/master/activerecord/lib/active_record/railties/databases.rake#L122

手动步骤

RAILS_ENV=test rake db:drop
RAILS_ENV=test rake db:create
RAILS_ENV=test rake db:migrate

答案 1 :(得分:0)

我找到了修复rails db:reset命令的方法,您只需要在config.active_record.schema_format = :sql中添加行application.rb,以便将有关序列的信息存储在structure.sql中。请注意,默认模式转储:ruby中关于序列的信息未存储在schema.rb文件中。

重要:确保首先使用structure.sql创建rails db:migrate,然后运行rails db:reset。仅rails db:migrate之后,我仍然收到您要修复的错误。