将数据库从开发导出到生产
Posted
技术标签:
【中文标题】将数据库从开发导出到生产【英文标题】:Exporting database from development to production 【发布时间】:2016-05-21 13:33:20 【问题描述】:我正在使用 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】:错误是因为你的数据库有外键,yaml_db 不支持。
我认为最简单的解决方案是使用带有--disable-triggers
标志的pg_dump
导出您的开发数据库,然后使用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
可以通过尝试照常截断表来截断表(这在具有延迟触发器的表上是不允许的)并在截断失败时删除。
【讨论】:
我刚刚尝试使用 yaml,因为我在一些教程中看到了它。使用 pg_dump 和 pg_restore,我怎样才能在我的本地主机和我的虚拟机之间做到这一点? 当然,具体细节取决于主机,但通常你会使用 scp 将转储复制到你的虚拟机,使用 ssh 登录虚拟机,然后在那里运行 pg_restore。 如果您的虚拟机使用的数据库可以直接从您的开发机器访问,您可以在笔记本电脑上运行 pg_restore 并将其指向虚拟机的数据库。但是,出于安全原因,该数据库可能无法从外部访问。以上是关于将数据库从开发导出到生产的主要内容,如果未能解决你的问题,请参考以下文章
如何将所有事件数据从 Firebase 导出到 BigQuery?