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

dri*_*zle 17 migration rake schema ruby-on-rails

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

sco*_*ttd 19

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


小智 18

尝试

RAILS_ENV=development rake db:drop
Run Code Online (Sandbox Code Playgroud)

之前

RAILS_ENV=development rake db:migrate
Run Code Online (Sandbox Code Playgroud)

而且要快乐!

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

  • 也许这与`rake db:migrate:reset`相同? (8认同)
  • 这有潜在危险,因为它会从数据库中清除现有数据. (6认同)
  • rake db:drop会删除所有表,因此下一个rake db:migrate将从头开始并应用所有迁移 (3认同)

hof*_*ff2 15

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

insert into schema_migrations values('20090521153438');
Run Code Online (Sandbox Code Playgroud)

(或者你的迁移数量)

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

insert into plugin_schema_migrations values('my_plugin', '005');
Run Code Online (Sandbox Code Playgroud)

  • 好悲伤,谢谢你!这是我见过的唯一解决方案**不会删除所有数据**.如果您有不想删除的表中的数据,请使用此选项:) (2认同)

Mik*_*ike 6

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