【问题标题】:Possible to rake db:schema:load without wiping the database可以在不擦除数据库的情况下 rake db:schema:load
【发布时间】:2012-04-12 17:51:02
【问题描述】:

我一直在处理我的开发数据库,​​并准备将其转移到生产环境中。我在 Rails 之外进行了一些编辑,因此我的所有更改都没有迁移。我知道我可以rake db:schema:dump 生成一个 schema.rb 文件,但是我可以将它应用于已经填充的生产数据库而不擦除数据吗?类似于rake db:schema:load 的东西不擦除数据?

如果没有,我是否只需要手动创建能够赶上生产数据库的迁移?如果我确实进行了这些迁移,那么将来在开发盒上对rake db:migrate 的所有调用是否都会失败,因为迁移中的更改已经存在于开发数据库中?

【问题讨论】:

    标签: ruby-on-rails migration


    【解决方案1】:

    rake db:schema:load 的问题在于它会强制创建表,你可以在db/schema.rb 中看到:

    create_table :users, :force => true do |t|
      # etc
    end
    

    我建议您创建缺失的迁移。您可以通过手动将时间戳添加到schema_migrations 表来修复本地开发数据库。这就是手动更改架构的结果。

    我个人始终确保rake db:migrate:reset(删除所有表并从头开始迁移)将产生与rake db:schema:dump 相同的db/schema.rb。数据库模式中的任何更改都必须通过迁移自动执行。您甚至可以通过运行 rake db:migrate:reset 并断言 db/schema.rb 与源代码管理中的内容没有变化来使其成为 CI 脚本的一部分。

    【讨论】:

    • 如何执行以下步骤:“通过手动将时间戳添加到 schema_migrations 表来修复本地开发数据库”?
    • 添加迁移时,它以时间戳开头,例如 db/migrate/201204131212_create_users.rb。这些时间戳存储在schema_migrations 表中。只需将它们与您最喜欢的工具一起添加到数据库中即可。
    • 那么如果我将时间戳添加到schema_migrations 表中然后运行db:migrate,那么迁移将不会运行?
    • 另外,尝试运行 rake db:migrate:status 以查看哪些迁移已运行,哪些未运行。
    猜你喜欢
    • 2011-06-24
    • 2011-09-22
    • 2012-01-11
    • 1970-01-01
    • 2014-04-06
    • 2014-09-17
    • 2013-12-05
    • 1970-01-01
    • 2013-03-19
    相关资源
    最近更新 更多