【问题标题】:Is it possible to add or remove columns without a migration file?是否可以在没有迁移文件的情况下添加或删除列?
【发布时间】:2017-04-26 04:58:45
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您是否关心开发环境中那些列中的数据?您可以手动删除它们,添加缺少的迁移以添加它们,然后在任何地方运行该迁移。顺便说一句,schema.rb 基于您数据库的当前状态,这可能与您的迁移有任何关系,也可能没有任何关系。
  • provider 和 uid 所在的表的名称是什么?听起来“uid”是“user_id”的缩写,它用于与 :users 表的关联,因为用户 id 只是 :users 表中的普通 id。也许您可以向我们展示架构?
  • @muistooshort 如何手动删除列?不,我不在乎数据。
  • @user125272 这两列都应该是 User 表的一部分。 “uid”表示用户的 Facebook ID,如果他们使用 Facebook 在我的应用上创建帐户。
  • 您可以使用psql 连接到数据库并说alter table users drop column provider; alter table users drop column uid;。或者您可以编写迁移以删除列,在您的开发环境中运行迁移,然后删除迁移。

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


【解决方案1】:

如果我是你,我会按照下面的快速修复,虽然不是那么好,但万一迁移混乱,我会这样做。

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

问题: 这样,您可以修改您的更改,但是关注开发人员呢。迁移是一种帮助每个开发人员和每个环境保持架构一致的方法。

这样做的好方法:您可以运行rake db:migrate:status 列出所有已编写但未删除的迁移,您可以查看其中有多少已更新,并且他们中有多少人被击倒了。可能是,添加列的迁移是在过去编写的,但它是在您的本地环境中完成的,而不是在生产环境中。

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

rake db:migrate:down VERSION=(version_number)

并且执行rake db:migrate 将增加过去的任何迁移。

【讨论】:

  • 即使“provider”和“uid”当前在我的生产 schema.rb 中,我是否应该这样做?这不会引起冲突吗?
  • 所以你基本上是说provider & uid 在生产模式中存在,但实际上在生产中不存在?
  • 对。我也觉得这很奇怪。当我在 Rails 控制台中输入“用户”时,我会返回所有列的列表,但既不包括“提供者”也不包括“uid”。但它们列在实时 schema.rb 中。
  • 那么如果它们已经在 schema.rb 中,而我用迁移文件添加它们,会不会导致冲突?
  • Rails 来救我们了。运行rake db:schema:load,因为它将获取当前架构文件,并使您的数据库结构看起来像这样。
猜你喜欢
  • 2018-06-03
  • 1970-01-01
  • 1970-01-01
  • 2020-02-02
  • 2019-06-25
  • 2010-10-25
  • 2020-05-04
  • 2010-10-18
  • 2020-12-06
相关资源
最近更新 更多