Bootstrap

【Postgres_Python】使用python脚本将多个PG数据库合并为一个PG数据库

需要合并的多个PG数据库表个数和结构一致,这里提供一种思路,选择sql语句insert插入的方式进行,即将其他PG数据库的每个表内容插入到一个PG数据库中完成数据库合并

示例代码说明:

选择一个数据库导出表结构为.sql文件(可借助Navicat工具),在此基础上修改.sql内容加入insert语句和dblink语句,数据可能存在重复需要在每个insert插入语句后带上ON CONFLICT DO NOTHING; 数据库名设置为一个通用变量,修改好后的.sql文件就是一个样本文件。复制一个pg数据库并修改名称作为总库,总库需要添加dblink扩展,批量将.sql样本文件中的数据库名替换为其他要合并的数据库名并另存为新的.sql文件,再批量执行每个.sql文件即可。.sql文件修改另存可参考文章:【数据处理_Python】使用python脚本将模板文件修改内容后重命名另存为新文件

import psycopg2
import subprocess
import os
def publicsql(old_string,input_sql,input_dir,output_dir):
    with open(input_sql, 'r') as infile:
        content = infile.read()
        for filename in os.listdir(input_dir):
            if filename.endswith('.sql'):
                nameparts = filename.split('.')
                new_string = nameparts[0]
                # 执行替换操作
                new_content = content.replace(old_string, new_string)
                # 写入新文件
                output_file_path = os.path.join(output_dir, new_string + '.sql')
                with open(output_file_path, 'w') as oufile:
                    oufile.write(new_content)
                oufile.close()
    infile.close()
# 要替换的字段
old_string = "database"
# 样本文件
input_sql = r'E:\test\public.sql'
# 读取替换字段文件路径
input_dir = 'E:/test/chongqinghq/'
# 修改文件后输出路径
output_dir = 'E:/test/publicsql/'
publicsql(old_string,input_sql,input_dir,output_dir)
#数据库连接信息
database_name = 'hqdb_500100_20241112' #总库名称
username = 'postgres'
password = 'postgres'
host = 'localhost'
port = '5432'
os.environ['PGPASSWORD'] = password
# 获取文件夹下所有.sql文件名称
filenames = os.listdir(output_dir)
# 遍历文件列表
for filename in filenames:
        output_file = output_dir + filename
        commandimport = f'D:/Program Files/PostgreSQL/10/bin/psql -h {host} -p {port} -U {username} -d {database_name} -f {output_file}'
        subprocess.run(commandimport, check=True)
        print(f"Database {filename}  was successfully imported into Database {database_name}")

输出结果示例:

.sql样本文件示例:

;