为什么schema.rb在运行rake db:migrate时会发生变化(在Git眼中)?

时间:2010-06-05 07:12:41

标签: ruby-on-rails git migration

我知道这是一个小小的将军,但它一直困扰着我。我一直在使用Git远程处理许多rails项目,每次我执行git pull并看到有某种数据更改(迁移或schema.rb更改)我执行{{1} }。

这些通常运行正常,我可以继续工作。但是,如果您执行rake db:migrate然后git pull,那么您的工作目录是干净的(显然)然后执行git status(显然有更改时)和另一个rake db:migrate和所有您的db / schema.rb突然发生了变化。我只是立即执行git status重置回schema.rb文件的最新提交版本,但为什么这是必要的?!什么是铁路?更新时间戳?我似乎无法弄清楚差异是什么,但也许我只是遗漏了什么?

4 个答案:

答案 0 :(得分:10)

架构使机器能够在第一次设置时运行rake db:schema:load,而不必运行迁移,如果模型被重命名或删除等,迁移可能会过时。它应该在更新后更新迁移,并且您始终希望将最新版本检入源代码管理。

答案 1 :(得分:5)

转储中属性的顺序反映了数据库中属性的顺序,如果一个人一直在本地玩迁移,手动向前和向后运行以及编辑要获取的内容,则可能会失去同步他们就是这样。可以创建一个状态,其中推送器schema.rb中的属性顺序与其他人在运行迁移时将看到的不同。

如果很容易重新创建开发数据,只需从schema.rb重建数据库 - 然后每个人都恢复同步(但请记住,您无法从也创建表的SQL转储重新加载数据 - 这将重新创建问题。它必须是一个仅数据转储/加载)。在最坏的情况下,您可以创建迁移以删除列,而另一个迁移则重新添加。

答案 2 :(得分:2)

schema.rb反映了您的数据库架构,因此当您迁移(使用更改)时,您的架构也会更改以反映您的数据库更改。我通常将schema.rb添加到我们的gitignore,以及database.yml(可能因为而不是使用schema:如下所示加载,我通常在克隆现有应用程序时执行sql转储 - 但这只是我)

答案 3 :(得分:-2)

db:migrate的结尾是转储架构。它将有不同的时间戳(git应该告诉你),不同版本的rails / database gems会给你略微不同的格式。这一直是一个小麻烦。

我建议您将schema.rb添加到.gitignore文件中。