这里有一个非常简单的问题——如果随着应用程序变得越来越复杂,迁移会变得缓慢而繁琐,如果我们可以调用更干净的rake db:schema:load,那么迁移为什么会存在呢?

如果上述问题的答案是迁移用于版本控制(逐步记录数据库的更改),那么随着应用程序变得更复杂,rake db:schema:load的使用也越来越多,它们是否继续保持其主要功能?


注意:

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

推荐答案

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

尽管如此,我认为偶尔"崩溃"迁移是一种体面的做法.这需要删除旧的迁移,用单个迁移(非常类似于您的schema.rb文件)替换它们,并更新schema_migrations表以反映此更改.Be very careful when doing this! You can easily delete your production data if you aren't careful.

作为补充说明,我坚信您永远不应该将数据创建放在迁移文件中.seed.rb文件可以用于此任务,也可以用于定制rake或部署任务.将其放入迁移文件会将数据库模式规范与数据规范混为一谈,并且在运行迁移文件时可能会导致冲突.

Ruby-on-rails相关问答推荐

Gemfile需要较新版本的依赖项

如何在不触发每次编译的情况下运行`bin/rails测试`?

将参数传递给视图中的嵌入操作时遇到问题

我需要在我的 Rails 7 应用程序中保留 app/assets/config/manifest.js 吗?

jbuilder vs rails-api/active_model_serializers 用于 Rails 4 中的 JSON 处理

使用 javascript 提交 Rails 远程表单

Ruby on Rails 中的消息队列

适合mysql比较的Ruby datetime

Rails 4 查找没有子元素的父母

不带参数的 request.fullpath

如何找出现有 Rails 应用程序基于哪个 Rails 版本?

在 PostgreSQL 中强制字符串的最大长度

如何验证 ActiveRecord 中邮箱字段的格式?

Rails:使用 gem 卸载特定版本的库

测试:如何在不损失速度的情况下专注于行为而不是执行?

Rails HABTM - 正确删除关联

如何为 Rails 控制器添加延迟以进行测试?

使用设计创建一个用户显示页面

将数组传递到 hidden_​​field ROR

在 El Capitan 上安装 Nokogiri (1.6.7) 时出错