2012-04-12 22 views
1

我一直在挖掘我的开发数据库,​​并准备将其移至生产环境。我在rails之外做了一些编辑,所以我没有对所有更改进行迁移。我知道我可以rake db:schema:dump生成一个schema.rb文件,但我可以将它应用于已经填充的生产数据库而不擦除数据吗?与rake db:schema:load类似的东西没有擦除数据?可能耙分贝:模式:加载而不擦除数据库

如果不是,我是否需要手动创建可以捕捉生产数据库的迁移?如果我确实进行了这些迁移,将不会在开发框中对rake db:migrate的所有未来调用都失败,因为迁移中的更改已经存在于dev db中?

回答

1

rake db:schema:load的问题是,这将有力地创建表,你可以在db/schema.rb看到:

create_table :users, :force => true do |t| 
    # etc 
end 

我建议是,你创建缺少的迁移。您可以通过手动将时间戳添加到schema_migrations表来修复您的本地开发数据库。这是手动更改架构的结果。

我个人总是确保rake db:migrate:reset(删除所有表并从头开始迁移)将产生与rake db:schema:dump相同的db/schema.rb。数据库模式中的任何更改都必须通过迁移自动进行。通过运行rake db:migrate:reset,您甚至可以将其设置为您的CI脚本的一部分,并且声称db/schema.rb未从源代码管理中的内容更改。

+0

如何执行此步骤:“通过手动将时间戳添加到schema_migrations表来修复您的本地开发数据库”? – 2012-04-12 22:04:15

+0

当您添加迁移时,它将以时间戳开始,如'db/migrate/201204131212_create_users.rb'。这些时间戳存储在'schema_migrations'表中。只需将它们添加到您最喜欢的工具中即可在数据库中查看。 – iain 2012-04-13 08:01:20

+0

因此,如果我将时间戳添加到'schema_migrations'表,然后运行'db:migrate',那么迁移将不会运行? – 2012-04-13 17:28:56