是否rake db:迁移正确的命令以将schema.rb与数据库模式重新同步?

时间:2009-05-08 22:54:39

标签: ruby-on-rails schema migration rake

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

7 个答案:

答案 0 :(得分:18)

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

答案 1 :(得分:17)

尝试

RAILS_ENV=development rake db:drop

RAILS_ENV=development rake db:migrate

快乐!

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

答案 2 :(得分:15)

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

insert into schema_migrations values('20090521153438');

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

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

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

答案 3 :(得分:6)

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

答案 4 :(得分:2)

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

答案 5 :(得分:2)

使用 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文件而不再次运行任何迁移,或删除任何表(这意味着丢失这些表中的数据),因此这是您可以尝试的侵入性最小的方式第一

答案 6 :(得分:1)

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