rake db:schema:load 不填充 schema_migrations 表

Posted

技术标签:

【中文标题】rake db:schema:load 不填充 schema_migrations 表【英文标题】:rake db:schema:load not populating schema_migrations table 【发布时间】:2013-12-05 01:54:56 【问题描述】:

我有一个正在尝试重新创建的新数据库,但运行 rake db:schema:load 根本不会填充 schema_migrations 表。这样做的结果是每个迁移现在都处于待处理状态。 schema.rb 中的模式版本与最新的迁移匹配,this answer 将表明我认为正在发生的事情(Rails 使用当前迁移编号之前的所有迁移编号填充迁移表)在这种特定情况下没有发生。我的同事已经确认他们的数据库也发生了这种情况,所以这绝对是一个项目范围的问题。尽管 db 用户正在正确创建所有表,但我们正在使用带有自定义架构的 SQLServer。我完全被难住了。有什么想法吗?

【问题讨论】:

约翰,您对未接受的答案的评论对我很有帮助。我认为最好回答您自己的问题并接受答案。 【参考方案1】:

我遇到了类似的问题,Google 把我带到了这里。这与您的问题不完全相同,但我会写下来以防万一它对最终来到这里的任何人有所帮助,因为我找不到其他任何东西。

简而言之:rails db:schema:load 没有正确设置我的 schema_migrations 表 - 当我运行 rails db:migrate:status 时,最近的迁移被标记为 down,尽管从数据库中可以清楚地看到迁移实际上已经运行。这意味着当我尝试在我的应用中执行任何操作时,我收到了“迁移仍在等待中”错误。

原来问题出在db/schema.rb。在文件顶部,ActiveRecord::Schema.define(version: 20180803094506) do 行不正确。由于我的源代码管理中的混淆,20180803094506 是错误的时间戳。我通过将此时间戳更改为我最近迁移的时间戳(即db/migrate 中最后一个文件名称的第一部分)来解决了这个问题。

(Rails 源代码的相关位是here,如果有人感兴趣。)

【讨论】:

【参考方案2】:

根据 D. Patrick,回答我自己的问题:

所以最终结果是另一个开发人员安装了activerecord-nulldb-adapter,猴子修补了ActiveRecord::Schema.define,但没有运行initialize_schema_migrations_table()assume_migrated_up_version()。我卸载了 gem,运行了我的 db:schema:load 就好了。

【讨论】:

【参考方案3】:

尝试使用跟踪标志运行命令

rake db:schema:load --trace

在日志的末尾,您应该会看到行

-- initialize_schema_migrations_table()
   -> 0.0045s

另外,值得检查一下你是否正确地从模式和 schema_migrations 表生成表。

【讨论】:

很奇怪,它没有。在开发环境中,这些行是最后生成的:-- initialize_schema_migrations_table() -> 0.0034s -- assume_migrated_upto_version(20131111151423, ["/Users/---/code/---/db/migrate"]) -> 2.1161s 测试环境不执行这两条语句。我不确定什么会压制他们。 所以最终结果是另一个开发人员安装了 activerecord-nulldb-adapter,它猴子修补 ActiveRecord::Schema.define 并且不运行 initialize_schema_migrations_table() 或假设_migrated_up_version()。

以上是关于rake db:schema:load 不填充 schema_migrations 表的主要内容,如果未能解决你的问题,请参考以下文章

运行 rake db:schema:load 时出现“致命:角色“root”不存在”

rake db:schema:load 与迁移

Rails db:schema:load 错误:Mysql2::Error:无法删除或更新父行:外键约束失败

附加到 rake db:seed in rails 并在不复制数据的情况下运行它

Rails--bundle exec rake db:migrate

如何在不运行 rake spec 的情况下为 Rails rspec 测试准备测试数据库?