在轨数据库迁移
所以我已经经历了很多导轨教程添加新的列,我得到的是增加一个新的列到数据库默认为,例如,在轨数据库迁移
rails generate migration add_reset_to_users reset_digest:string reset_sent_at:datetime
以上将一个字符串和reset_sent_at的形式在日期迁移add_reset_to_users
我的问题的形式添加reset_digest是什么,如果我笨拙的一个晚上,在凌晨4点,只调用下面
rails generate migration add_reset_to_users reset_digest:string
我完全忘了reset_sent_at,但想在第二天早上实施它。我犯了直接将链接添加到db文件的错误,这是一个巨大的错误。
在这种情况下,我该怎么办?我是否简单地称为新迁移,如
rails generate migration add_reset_sent_to_users reset_sent_at:datetime
或者还有更好的方法吗?
首先,如果你还没有运行迁移,你可以直接打开迁移文件,和您的列添加到文件中,如
def change
add columns :table_name :column_name :column_type
end
在你的情况,你将修改文件,
def change
add columns :users :reset_digest :string
add columns :users :reset_sent_at :datetime
end
,然后运行
rake db:migrate
如果你已经跑了迁移,并且尚未运行后,任何其他迁移,您可以撤消它,通过
rake db:rollback STEP=1
,然后编辑迁移文件,并运行迁移
在Rails中进行迁移的经验法则是您总是创建一个新的迁移文件,除非您尚未与其他人共享您的代码,即推送到远程存储库,否则您可以在运行$ rake db:rollback
以及所有内容后更改旧迁移没问题,并且不会影响其他开发人员的工作(因为它仍在本地存储库中)。
所以,我鼓励你创建一个新的迁移,如果你已经提交,代码推到远程仓库,然后再改变了原有的迁移文件会伤害到其他开发商的生产力。在任何混乱的情况下,总是创建一个新的迁移:
rails generate migration add_reset_sent_to_users reset_sent_at:datetime
我认为这取决于什么状态你的Rails应用程序中。
如果你在生产应用程序,然后编辑迁移工作是不可取的,由于数据丢失和修改应该用新的迁移进行。
如果您在本地开发工作的话,我会直接编辑迁移和添加缺少的列,然后重新运行迁移。
不要担心编辑您的迁移,只需记住rake db:rollback
您正在编辑的迁移,否则您将会遇到错误。
def change
add_column('users', 'reset_digest', :string)
add_column('users', 'reset_sent_at', :datetime) # Would have to perform rollback before adding this line
end
到:
def up
add_column('users', 'reset_digest', :string)
add_column('users', 'reset_sent_at', :datetime) # Added after migration
**rake db:migrate
end
def down
remove_column('users', 'reset_digest', :string)
remove_column('users', 'reset_sent_at', :datetime) # Add this after rollback
**rake db:rollback
end
允许您更改您的迁移之前,你rake db:rollback
这需要多一点的代码,但
这是从改变你的迁移当我构建新应用程序时,我发现它更容易,而且事情经常发生变化。
默认情况下'rake db:rollback'的'STEP'是1,你不必在那里明确地写它。 – Surya 2014-10-29 20:02:54
嗯,是的,默认情况下它是1,但是你可以编写rake db:rollback STEP = n,用于n个步骤 – mudasir 2014-10-29 20:04:02
另外,当你与其他人分享你的代码时,它没有任何价值,那么你不打算改变迁移文件,无论是否已经运行迁移。这会严重影响其他人的工作和时间。 – Surya 2014-10-29 20:07:23