rake db:schema:load vs. migrations

ssc*_*rus 167 migration ruby-on-rails ruby-on-rails-3

这里非常简单的问题 - 如果迁移变得缓慢而繁琐,因为应用程序变得更加复杂,如果我们有更清洁rake db:schema:load的调用,为什么迁移根本存在呢?

如果上面的答案是迁移用于版本控制(数据库更改的逐步记录),那么当应用程序变得更复杂并且rake db:schema:load更多地使用时,它们是否继续维护其主要功能?


警告:

从这个问题的答案:rake db:schema:load 将删除生产服务器上的数据,因此在使用它时要小心.

jes*_*iss 202

迁移为数据库提供向前和向后的步骤更改.在生产环境中,必须在部署期间对数据库进行增量更改:迁移为此功能提供回滚故障保护.如果您rake db:schema:load在生产服务器上运行,您最终将删除所有生产数据.这是一个危险的习惯.

话虽如此,我认为偶尔"崩溃"迁移是一种体面的做法.这需要删除旧的迁移,用一次迁移(非常类似于您的schema.rb文件)替换它们并更新schema_migrations表以反映此更改.这样做时要非常小心!如果您不小心,可以轻松删除生产数据.

作为旁注,我坚信你绝不应该将数据创建放在迁移文件中.该seed.rb文件可用于此任务或自定义rake或部署任务.将此文件放入迁移文件会将数据库架构规范与数据规范混合在一起,并在运行迁移文件时导致冲突.

  • 感谢您告知rake db:schema:load删除所有生产数据! (79认同)
  • 我编写了一个gem来清除掉崩溃的迁移,而不是用模仿该模式的新迁移来替换掉崩溃的迁移,并提示用户如果尝试对某个数据库运行db:migrate,则使用db:schema:load。全新安装。@ [** clear_migrations **](https://github.com/ykessler/clear-migrations) (2认同)

小智 30

刚刚发现这篇文章,很久以前,并没有看到我期待的答案.

rake db:schema:load第一次将系统投入生产时非常棒.之后,您应该正常运行迁移.

这还可以帮助您随时清理迁移,因为即使清理了迁移,架构也具有将其他计算机投入生产的所有信息.


Sha*_*nak 9

迁移还允许您向数据库添加数据.但db:schema:load仅加载架构.


Jam*_*ney 6

因为可以回滚迁移,并提供其他功能.例如,如果您需要修改某些数据作为架构更改的一部分,那么您需要将其作为迁移来执行.


小智 5

作为其他 ORM 的用户,Rails 没有“同步和更新”功能对我来说总是很奇怪。即,通过使用模式文件(代表整个、最新的模式),遍历现有的数据库结构并根据需要添加/删除表、列、索引。

对我来说,这会更加稳健,即使可能会慢一些。