rake db:schema:load与迁移


171

这是一个非常简单的问题-如果应用程序变得越来越复杂,迁移会变得缓慢而麻烦,并且如果我们可以rake db:schema:load调用更清洁的方法,那么为什么根本不存在迁移呢?

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


警告:

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


5
+1我从不了解迁移的目的;为什么不仅仅通过版本控制模式?
替代

5
@alternative-迁移允许您执行其他操作,例如,如果您需要添加非空列,则可以用数据巧妙地填充该列,而无需使用某些默认值。
2014年

Answers:


208

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

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

附带说明一下,我坚信绝对不要将数据创建放在迁移文件中。该seed.rb文件可用于此或自定义耙或部署任务。将其放入迁移文件中会使数据库架构规范与数据规范混合在一起,并且在运行迁移文件时可能导致冲突。


80
感谢您通知rake db:schema:load删除了所有生产数据!
Magne 2012年

2
我没有用模拟架构的新迁移来替代“崩溃的”迁移,而是编写了一个gem来清除它们,并提示用户在db:schema:load尝试db:migrate重新安装时使用。@ clear_migrations
Yarin

可能是一个明显的答案,但是在第一次投入生产之前,您是否建议仅删除所有迁移并将db.schema用作第一次迁移?
dtc 2015年

30

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

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

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


因此您可以“清理”迁移,因为您不必使用它们吗?听起来像是一个奇怪的声明。
2013年

对我来说,db:schema:load除了在整个开发周期中节省几秒钟外,还没有什么好处。您是否曾经使用过耗时超过30秒的应用程序?我目前正在开发的应用程序中的迁移文件中有错误,并且如果没有错误修复或运行db:schema:load,它将永远不会迁移,这使我认为schema:load适用于应用程序开发出现问题时。
Ninjaxor 2015年

我为保持迁移而提出的另一个论点是,Rails核心团队将用户定向到instead of editing schema.rb, please use the migrations feature。因此,如果您在db:schema:load自动生成的文件上运行,并且没有要再次自动生成的迁移,则实际上是在手动“编辑”模式并禁用迁移。我希望我能从Rails指南中得到引用,但是他们不讨论schema:load,这在决定如何使用schema:load功能时使我感到沮丧。= /
Ninjaxor 2015年

我之所以来到此页面,正是因为我同意这一点。我的经验是,一旦网站投入生产,使用迁移进行更改将更加安全。尽管如此,db / schema.rb开头的注释恰恰说明了相反的情况!(我在每个项目开始时都会
遇到

@AbePetrillo哇,我完全错过了此评论。当然不是,我的意思是,您可以根据需要清理在所有生产计算机上运行的迁移。多年来,我一直都坚持使用它们,但是我的“帮助您随时随地清理迁移”的声明并不是要表示“我永远不必使用迁移”。因此,在部署新计算机时,请运行rake db:schema:load而不是rake db:migrate。然后从那里开始rake db:migrate
ereslibre

9

通过迁移,您也可以将数据添加到数据库。但是db:schema:load仅加载架构。



4

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

对我来说,这可能会更健壮,即使可能慢一点。


1
在某些时候,将包含数据的数据库从一个复杂的架构迁移到另一个架构的任务并不容易。可能无法自动解决该问题,并且可能无法通过单个步骤一致地迁移数据。Rails迁移是主要的,架构是依赖的。每次迁移都会自动重新创建架构,反之亦然。
oklas

Rails自己的指南明确指出了它schema是主文件,而不是迁移文件。
德伦米

0

我已经将其发布为评论,但是最好将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文件中。


0

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

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

您可以在此处找到有关rake数据库命令的更多信息。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.