如何使 Rails 4 个测试数据库保持同步?

How do you keep Rails 4 test db in sync?

我有:

ActiveRecord::Migration.maintain_test_schema!

但是当我用新的迁移更改我的开发数据库时,我得到:

Migrations are pending. To resolve this issue, run:

    bin/rake db:migrate RAILS_ENV=test

当我尝试它时,它假设测试数据库是空白的,并且想要 运行 迁移 #1 但是那个错误。

好像 schema_migrations 表从测试数据库中丢失了。

只要在测试配置中声明了 ActiveRecord::Migration.maintain_test_schema!,您就不需要管理测试数据库的迁移(例如,如果您使用 RSpec,则为 rails_helper/spec_helper):

rails_helper.rb:

require File.expand_path('../../config/environment', __FILE__)

#...

ActiveRecord::Migration.maintain_test_schema!

#...

RSpec.configure do |config|

但是,如果您想使用 schema.rb 文件设置测试数据库,则可以 运行 rake db:test:prepare 代替直接迁移 运行。

好吧,我终于找到了解决问题的方法:

 3099  rake db:migrate RAILS_ENV=test
 3100  rake db:migrate

通知我运行3099在3100之前that具体顺序。我必须先迁移测试数据库,然后才能迁移开发人员。然后我的测试仍然 运行 正常。如果我朝另一个方向走,我会遇到上述问题。

我今天遇到了这个问题:

Rails 5.1.2
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-linux]

这是因为我有一个创建 table 的迁移,并试图在我重命名的列上创建和索引,所以 [null] 上的索引出现在模式中,这显然是开发数据库可以处理,但测试数据库不能没有涉及如何迁移数据库的一些恶作剧......每次我需要迁移我不得不 运行

rails db:drop
rails db:migrate RAILS_ENV=test
rails db:migrate
rails db:seed

为了让开发数据库和测试数据库都能工作到我可以 运行 测试的程度。最终,我在 db/schema.rb 中的现有 table 中的空列上找到了索引,在 table 创建迁移中找到索引命令并将其清除是一件相当简单的事情。之后,只需

即可将数据库恢复原状
rails db:migrate
rails db:seed