将数据库从开发导出到生产

时间:2016-05-21 13:33:20

标签: ruby-on-rails postgresql

我正在使用gem yaml_db将我的Postgres开发数据库导出到生产,这是在我的Ruby on Rails应用程序所在的虚拟机上。

我正在使用rake db:data:dump RAILS_ENV=development创建data.yml和rake db:data:load RAILS_ENV=production来导入数据,但我在导入时遇到了错误。

rake aborted!
ActiveRecord::StatementInvalid: PG::InFailedSqlTransaction: ERROR:  current transaction is aborted, commands ignored until end of transaction block
: DELETE FROM "improvement_actions"

PG::FeatureNotSupported: ERROR:  cannot truncate a table referenced in a foreign key constraint
DETAIL:  Table "comments" references "improvement_actions".

有谁知道如何解决这个问题?或者是否有另一种导出数据库的方法?

1 个答案:

答案 0 :(得分:1)

错误是因为您的数据库有外键,yaml_db不支持。

我认为最简单的解决方案是使用带有pg_dump标记的--disable-triggers导出您的开发数据库,​​然后使用pg_restore将其导入您的生产数据库。

但是,如果你真的想使用yaml_db,那么rather complicated solution has been documented。该解决方案的核心是

  • 制作所有外键deferrable initially immediate(如果还没有)。记录的解决方案使用schema_plus gem,或者您可以在Postgres中执行。
  • monkey-patch yaml_db的SerializationHelper::Base#load在使用set constraints all deferred;
  • 的每次加载交易期间推迟所有约束
  • monkey-patch yaml_db的SerializationHelper::Base#truncate_table通过尝试像往常一样截断(在具有延迟触发器的表上不允许)来截断表,并在截断失败时删除。