Ruby on rails rake数据库:模式:加载与迁移

Ruby on rails rake数据库:模式:加载与迁移,ruby-on-rails,ruby-on-rails-3,migration,Ruby On Rails,Ruby On Rails 3,Migration,这里有一个非常简单的问题——如果随着应用程序变得越来越复杂,迁移会变得缓慢和繁琐,如果我们可以调用更干净的rake db:schema:load,那么迁移为什么会存在呢 如果上述问题的答案是迁移用于版本控制(对数据库更改的逐步记录),那么随着应用程序变得更加复杂,并且越来越多地使用rake db:schema:load,它们是否继续维护其主要功能 警告: 从这个问题的答案来看:rake db:schema:load将删除生产服务器上的数据,因此在使用它时要小心。因为迁移可以回滚,并提供附加功能

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

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


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

因为迁移可以回滚,并提供附加功能。例如,如果您需要在模式更改中修改某些数据,那么您需要在迁移时这样做

迁移还允许向数据库添加数据。但是db:schema:load只加载模式。

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

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


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

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


对我来说,这会更加有力,即使可能会慢一点。

刚刚偶然发现了这篇文章,那是很久以前的事了,没有看到我期望的答案

rakedb:schema:load
是您第一次将系统投入生产的绝佳选择。之后,您应该正常运行迁移


这也有助于您随时清理迁移,因为即使在您清理迁移时,模式也具有将其他机器投入生产的所有信息。

我已经发布了注释,但觉得最好将db/schema.rb文件的注释放在这里:

# Note that this schema.rb definition is the authoritative source for your
# database schema. If you need to create the application database on another
# system, you should be using db:schema:load, not running all the migrations
# from scratch. The latter is a flawed and unsustainable approach (the more migrations
# you'll amass, the slower it'll run and the greater likelihood for issues).
#
# It's strongly recommended that you check this file into your version control system.

实际上,根据我的经验,最好将迁移文件放在git中,而不是schema.rb文件…

rake db:migrate
在数据库中设置表。运行migration命令时,它将在db/migrate/中查找任何ruby文件,并从最旧的文件开始执行它们。每个迁移文件名的开头都有一个时间戳

与运行尚未运行的迁移的
rake db:migrate
不同,
rake db:schema:load
将已在
db/schema.rb
中生成的架构加载到数据库中


您可以了解更多信息。

+1我从未理解迁移的目的;为什么不只是对架构进行版本控制?@alternative-迁移允许您执行其他操作,例如,如果您需要添加非空列,您可以使用数据巧妙地填充该列,而不是使用某些默认值。感谢您通知rake db:schema:load删除所有生产数据!我没有用一个模仿模式的新迁移替换“崩溃”的迁移,而是编写了一个gem来清除它们,如果用户试图针对新安装运行
db:migrate
,则提示用户使用
db:schema:load
。@这可能是一个显而易见的答案,但在第一次投入生产之前,您是否建议删除所有迁移并使用db.schema作为第一次迁移?注意:
rake db:schema:load
对于设置测试数据库也非常有用。因此,您可以“清理”迁移,因为您不必使用它们?听起来很奇怪。我不清楚
db:schema:load
除了在整个开发周期中节省几秒钟之外还有什么好处。您是否曾经使用过一个需要30秒以上时间才能构建的应用程序?我目前正在开发一个迁移文件中有bug的应用程序,如果没有bug修复或运行
db:schema:load
,它将永远无法迁移,这让我觉得schema:load是用于在应用程序开发出现问题时使用的。我认为保留迁移的另一个理由是rails核心团队将用户引导到
而不是编辑schema.rb,请使用迁移功能
。因此,如果您在一个自动生成的文件上运行
db:schema:load
,而您没有要再次自动生成的迁移,那么您实际上是在手动“编辑”模式并放弃迁移。我希望能从rails指南中得到一条关于这方面的引文,但他们没有讨论schema:load,这让我在决定如何使用schema:load特性时更加沮丧=/我来到这一页正是因为我同意这一点。我的经验是,一旦站点投入生产,使用迁移来更改它会更安全。尽管如此,db/schema.rb开头的注释恰恰相反!(我在sta有问题