【问题标题】:Is rake db:migrate the correct command to re-sync schema.rb with your database schema?rake db:migrate 是否是正确的命令以重新同步 schema.rb 与您的数据库架构?
【发布时间】:2010-10-24 22:30:34
【问题描述】:

我运行“rake db:migrate”以将 schema.db 与我的数据库架构重新同步。但它失败了,说我的一张表已经存在。我认为它试图重新创建表。如果您只想更新 schema.rb 以反映您在数据库中独立于 Rails 所做的任何更改,如果不是“rake db:migrate”,您应该使用什么命令?关于这类事情的最佳文档来源是什么?

【问题讨论】:

  • 试试 rake db:schema:dump,然后给你的编辑一点时间来处理文件更改。

标签: ruby-on-rails schema migration rake


【解决方案1】:

"rake db:migrate" 将尝试为您的项目运行所有未完成的迁移。如果您只想转储架构,请执行“rake db:schema:dump”。
但我认为你有一个问题,它说该表已经存在。您的一项迁移失败,因为它尝试添加的表已存在于您的数据库中。你是手工制作的吗?您是否进行了迁移,但没有为它写下来?您需要先解决此问题,然后才能编写未来的迁移。如果这只是一个错误,并且表格在那里并且正确并且您想忽略它。我的建议是通过在失败的迁移中注释掉创建表来解决它。然后运行“rake db:migrate”。然后,但是创建表回来了。这将更新您的架构版本。
确保你写下所有迁移的正确记录。

【讨论】:

    【解决方案2】:

    试试

    RAILS_ENV=development rake db:drop
    

    之前

    RAILS_ENV=development rake db:migrate
    

    要快乐!

    确保在测试或开发环境中运行它,因为这会删除数据库/表

    【讨论】:

    • rake db:drop 删除所有表,因此下一个 rake db:migrate 将从头开始并应用所有迁移
    • 也许这和rake db:migrate:reset一样?
    • 这有潜在的危险,因为它会从数据库中清除您现有的数据。
    【解决方案3】:

    我发现偶尔,当事情变得有点奇怪时,你会发现自己处于 Rails 想要运行迁移的情况下,它应该正确地考虑已经完成(表已经存在等) .您可以通过查找其编号(文件名开头的数字部分)来标记迁移完成,进入 mysql 并发出如下查询:

    insert into schema_migrations values('20090521153438');
    

    (或无论您的迁移次数是多少)

    或者,如果它是使用 Desert 的 migrate_plugin 运行的插件迁移:

    insert into plugin_schema_migrations values('my_plugin', '005');
    

    【讨论】:

    • 好心,谢谢你!这是我见过的唯一一种不会删除所有数据的解决方案。如果您不想删除表中的数据,请使用此选项:)
    • 另一种策略是注释掉违规迁移的主体,然后迁移。
    【解决方案4】:

    rake db:migrate:reset 将删除所有表,运行所有迁移并创建一个新的schema.rb 文件。

    【讨论】:

      【解决方案5】:

      试试rake db:schema:dumprake db:migrate:redo

      【讨论】:

        【解决方案6】:

        使用rake db:schema:dump

        $ rake -T | grep schema
        rake db:schema:dump # Create a db/schema.rb file that is portable
                            #  against any database supported by ActiveRecord
        

        rake db:schema:dump 重新创建 db/schema.rb 文件,而无需再次运行任何迁移或删除任何表(这意味着丢失这些表中的数据),因此这是您可以先尝试的侵入性最小的方法。

        【讨论】:

          【解决方案7】:

          回答您关于文档的最后一个问题:

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-04-19
            • 2011-04-18
            • 1970-01-01
            • 1970-01-01
            • 2011-09-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多