gpt4 book ai didi

postgresql - 将 pg_restore 与多个转储一起使用时管理外键

转载 作者:行者123 更新时间:2023-11-29 13:41:50 25 4
gpt4 key购买 nike

我有一个奇怪的问题。我们试图为我们的本地环境创建一个数据库基线,其中预先植入了非常具体的数据。我们希望确保每个人都在使用相同的数据进行操作,从而使协作和审查代码变得更加简单。

我的想法是,每当我们运行迁移或决定本地开发需要一个新帐户时,运行一个命令来转储数据库。这个问题是数据库转储大约 17MB。我试图避免每次更新数据库时都必须向 GitHub 添加 17MB 的文件。

所以我能想到的最佳解决方案是设置一个脚本来转储数据库中的每个单独的表。这样,如果更新了单个表,我们只会将该备份推送到 GitHub,并且它会是一个大约 200kb 的文件,而不是 17mb。

我遇到的主要问题是尝试恢复数据库。使用完整转储,处理外键相对简单,因为它全部在单个恢复命令中完成。但是随着多次恢复,它变得有点复杂。

我正在寻找一种方法将所有表恢复到数据库中,忽略触发器和约束,然后在填充数据后再次启用它们。 (或根据外键的定义顺序找到一种导出表的方法)。有很多表需要处理,因此手动执行此操作会有些困难。

如果我禁用/重新启用约束,我还担心数据库的关系完整性。任何帮助或建议将不胜感激。

现在我在每个表上运行以下命令:

pg_dump postgres://user:password@pg:5432/database -t table_name -Fc -Z9 -f /data/www/database/data/table_name.bak

然后这个命令将所有备份恢复到数据库。

$data_command = "pg_restore --disable-triggers -d $dbUrl -Fc \"%s\"";
$backups = glob("$directory*.bak");
foreach($backups as $data_file){
if($data_file != 'data_roles.bak') {
exec(sprintf($data_command, $data_file));
}
}

这显然行不通,因为我遇到了大量“关系不存在”错误。我想我只是在寻找一种更好的方法来实现这一目标。

最佳答案

我会将表数据和数据库元数据分开。

创建一个前后数据脚本

pg_dump --section=pre-data -f pre.sql mydb
pg_dump --section=post-data -f post.sql mydb

然后只转储每个表的数据:

pg_dump --section=data --table=tab1 -f tab1.sql mydb

恢复数据库,先恢复pre.sql,再恢复所有表数据,再恢复post.sql

前后的数据会经常变化,但不会很大,所以这应该不是问题。

关于postgresql - 将 pg_restore 与多个转储一起使用时管理外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54239004/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com