2013-07-23 121 views
2

我是Rails的新手,我试图弄清楚rake db:createrake db:migrate是幂等的。耙db:创建和耙db:迁移idempotent?

换句话说,我可以反复运行这两个命令反对我的数据库(postgres或mysql),而不会造成问题吗?

想法是自动化Rails部署,并且每次部署Rails应用程序时都运行这些命令。我想确保它不会以某种方式保存数据库。

任何其他围绕耙db数据库迁移idempotence gotcha是超级赞赏。

+1

简短答案是YES –

回答

9

是的,它们是幂等的,运行这两个命令应该让你的数据库“最新”,一旦你运行完成,然后再运行它们应该什么都不做。

然而,一个更好的方式来建立一个全新的机器是使用

rake db:setup 

db:setup只是执行这些任务的顺序:

db:create 
db:schema:load 
db:seed 

通知db:setup不运行db:migrate,而是只需运行db:schema:load。迁移仅在将现有数据库升级到较新版本时需要,因为它们描述了两个版本模式之间的差异。但是,当您完全设置新的数据库时,可以跳过整个迁移历史并跳转到最近的模式状态,即使用db:schema:load加载当前模式。如果与您的应用程序相关,则db:seed将运行您的db/seeds.rb文件以创建初始数据。

运行rake -T来详细描述所有的Rails Rake任务,或查看ActiveRecord源文件直接读取代码。

+0

太棒了。不知道db:setup。快速跟进。耙db:设置幂等,以及? – rsingh

+1

我不确定是否会。如果'db:seeds'重新运行,取决于您如何构建它,它可能会在您每次运行时创建新记录。但是既然你自己写了,你也可以检查必要的记录是否已经存在,只有在必要时才创建它们。 –

+0

另外,您可以从ActiveRecord查看Rakefile本身的来源,以确定究竟发生了什么:https://github.com/rails/docrails/blob/master/activerecord/lib/active_record/railties/databases.rake –