我最近开始工作的一家公司在某个时间点成功删除了他们的一个迁移文件,或者至少我相信这一点。这个文件创建了一个users
的表,但是这个表已经被删除了。
如果不是因为本地构建项目会失败,我通常不会介意,除非我在包括该表创建在内的早期迁移中临时硬插入,这是因为以后的迁移会修改这个假定的users
表上的列,并最终删除该表。我最近所做的只是将它添加到一个现有的迁移文件中,该文件正在创建另一个表,比如products
,我一直在从一个分支"携带"到另一个分支,非常小心不要提交它
它看起来像这样(示例(:
class AddProductsTable < ActiveRecord::Migration
def change
create_table :products do |t|
end
end
end
我已更改为:
class AddProductsTable < ActiveRecord::Migration
def change
create_table :products do |t|
end
create_table :users do |t|
end
end
end
我本质上想知道这样做是否会对生产造成任何损害。毕竟,迁移已经运行了,所以不会再执行了?我很想这么做,因为当我需要重建时,总是记得重新创建或拖着这段代码,这已经很快过时了,但我对不会发生不好的事情没有足够的信心,也没有在谷歌上找到太多答案。
PS。,我是该项目目前唯一的开发人员,他们没有任何其他开发人员可以问我这个问题。
如果您还没有运行迁移,那么编辑迁移文件没有问题否则:引用导轨:
通常,编辑现有迁移不是一个好主意。如果现有版本的迁移已经在生产机器上运行,那么您将为自己和同事创造额外的工作,并导致严重的头痛。相反,您应该编写一个新的迁移来执行您需要的更改。编辑尚未提交到源代码管理的新生成的迁移(或者,更普遍地说,尚未传播到开发机器之外(相对无害。
来源:更改现有迁移
只要迁移是在生产环境中运行的,就不会在生产环境下引起任何问题。如果必须的话,您甚至可以删除它(注意:如果您有其他团队成员,则不建议删除,因为如果他们还没有在本地运行迁移,他们将面临您所面临的问题(。
要检查迁移是否已在给定环境中运行,可以使用以下rake命令:
RAILS_ENV=<environment> bundle exec rake db:migrate:status
例如,在开发中这样做,你会得到:
RAILS_ENV=development bundle exec rake db:migrate:status
up 20190201100000 Add soups table
up 20190301100000 ********** NO FILE **********
up 20190601100000 Add supplies table
up 20190501100000 Remove food column from supplies table
up 20190601100000 Add test table
up 20190701100000 Add foo column to test
up 20190801100000 Add products table
down 20191119030000 I havent ran this
上面的告诉您哪些迁移已经运行(用向上表示(,哪些迁移尚未运行(用向下指示(。它还告诉您是否存在与迁移相关联的文件,或者该文件是否已被删除(请参阅上面没有文件的文件(。当您将项目部署到生产环境时,将运行向下迁移,因此修改向上的迁移不会有任何作用。
我建议您在生产中运行以下操作,以确保您正在修改的迁移具有关闭状态。
RAILS_ENV=production bundle exec rake db:migrate:status