Rails如何知道迁移已经被执行?

3
我刚才加载了一个数据库转储文件,它不仅创建了表格并将数据加载到这些表格中,还升级了很多迁移。运行剩余的迁移后,运行rake db:migrate:status告诉我每个迁移的状态都是UP,但实际上迁移并没有完成它们应该做的事情。例如,我有一个创建名为notes的表的迁移。它已经被升级了,但是表格notes不存在。所以我不得不重新执行此迁移,但注释掉self.down方法中的代码。我的问题是:即使它试图创建的表尚未在数据库中创建,迁移如何处于UP状态。或者我猜,我之前加载的数据库转储文件以某种方式填充了schema_migrations表,Rails认为大多数迁移都已升级,但实际上它们并没有。现在,我需要手动运行rake db:migrate:redo VERSION=xxxxxxx来重新执行每个迁移,还是有更好的解决方案?
2个回答

9
Rails会在你的schema中添加一个名为schema_migrations的表,其中的单个列存储每个迁移的时间戳。它不会出现在schema.rb中,但是Rails将比较db/migrate中的时间戳和schema.rb的时间戳与schema_migrations表的值来确定已运行哪些迁移。

enter image description here


1
这是真的!此实现的源代码可以在此找到 https://github.com/rails/rails/blob/f47b4236e089b07cb683ee9b7ff8b06111a0ec10/activerecord/lib/active_record/railties/databases.rake#L91 - Pavan

0
Rails使用Rack中间件ActiveRecord::Migration::CheckPending来实现这一点。
您可以在控制台中执行rack middleware来查看Rails正在使用的所有Rack中间件。

1
这并没有回答我的问题。 - Arslan Ali
我觉得我误解了你的问题。我认为在Rails环境中可能存在一些冲突,例如,如果你正在尝试在测试环境中创建数据库,则可能需要指定RAILS_ENV=test。 - qcam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接