在轨数据库迁移

在轨数据库迁移

问题描述:

所以我已经经历了很多导轨教程添加新的列,我得到的是增加一个新的列到数据库默认为,例如,在轨数据库迁移

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 

,然后编辑迁移文件,并运行迁移

+0

默认情况下'rake db:rollback'的'STEP'是1,你不必在那里明确地写它。 – Surya 2014-10-29 20:02:54

+0

嗯,是的,默认情况下它是1,但是你可以编写rake db:rollback STEP = n,用于n个步骤 – mudasir 2014-10-29 20:04:02

+1

另外,当你与其他人分享你的代码时,它没有任何价值,那么你不打算改变迁移文件,无论是否已经运行迁移。这会严重影响其他人的工作和时间。 – Surya 2014-10-29 20:07:23

在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

这需要多一点的代码,但

这是从改变你的迁移当我构建新应用程序时,我发现它更容易,而且事情经常发生变化。