是否可以在没有迁移文件的情况下添加或删除列?

时间:2016-12-11 01:12:15

标签: ruby-on-rails database postgresql database-migration

我正在为我的应用整合Facebook登录。我有一个名为“User”的模型,它应该有两列:“provider”和“uid”。一切都很好开发,但我只是注意到在生产中,“用户”没有任何一列。我尝试在我的服务器上重新迁移我的数据库,但它没有帮助。

所以我检查了我的实时代码,并且“provider”和“uid”都列在我的schema.db中,但是我的任何迁移文件,生产或开发中都没有提到它们。在我的任何提交中都没有任何此类迁移文件的记录。不知何故,他们显然已添加到我的架构中,没有任何迁移文件。这甚至可能吗?我的意思是,如果我写了一个迁移文件并且稍后意外删除了它,我认为它仍会出现在我的提交中,对吧?很久以前我不记得我做了什么。

但无论如何,这是我的问题:我无法编写添加列的迁移文件,因为这会导致开发冲突,我无法写入删除它们的迁移文件,然后添加另一个文件,因为那样在生产中,服务器将尝试删除首先不存在的列。是否可以在不编写任何迁移文件的情况下添加或删除列?或者我应该写一个删除它们,在开发时迁移它,删除它,写另一个添加它们,然后在开发和生产时迁移它?

由于列在我的schema.db中但不在我的实际数据库中,我想真正的问题是迁移是否编辑了模式?因为如果是这样,那么我认为我可以进行向下迁移,然后在开发和生产上进行向上迁移。

1 个答案:

答案 0 :(得分:1)

如果我是你,我会遵循以下快速解决方案,虽然它并不是那么好,但是如果发生混乱的迁移,我会这样做。

编写一个添加列的迁移:provider& uid。不要在你的本地进行迁移,并且运行它没有任何意义。提交代码,将其部署到生产环境,然后在那里运行迁移。稍后,删除迁移,将代码推送到生产环境。删除迁移文件并不会撤消更改:它不会删除其中的两列。

<强>疑难杂症: 这样,您可以修改您的更改,但是跟随开发人员呢?迁移是一种帮助维护每个开发人员和每个环境中的模式一致的方法。

这样做的好方法:您可以运行rake db:migrate:status列出所有已写入但尚未删除的迁移,并且您可以看到其中有多少迁移了#39} ; ed,以及其中有多少人已经失败了。可能是,添加列的迁移是在过去编写的,但它取决于您的本地环境,但您还没有进行生产。

请记住,当您执行rake db:migrate:status时,它还会列出与每次迁移相关联的版本号,因此,如果您想要进行单次迁移,可以执行以下操作:

rake db:migrate:down VERSION=(version_number)

执行rake db:migrate会导致过去失败的任何迁移。