我正在使用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".
有谁知道如何解决这个问题?还是有另一种导出我的数据库的方法?
该错误是因为您的数据库具有外键,yaml_db不支持该外键。
我认为最简单的解决方案是使用pg_dump
带有--disable-triggers
标志的导出您的开发数据库,然后使用将该标志导入到您的生产数据库pg_restore
。
但是,如果您确实要使用yaml_db,则已记录了一个相当复杂的解决方案。该解决方案的核心是
deferrable initially immediate
如果还没有的话)。记录在案的解决方案使用schema_plus gem,也可以在Postgres中进行。SerializationHelper::Base#load
来延迟每次加载事务期间的所有约束,set constraints all deferred;
SerializationHelper::Base#truncate_table
通过尝试像往常一样截断(在延迟了触发的表上不允许截断)来截断表,如果截断失败,则将其删除。本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句