当前位置: 首页 > article >正文

【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样本文件示例:


http://www.kler.cn/a/516991.html

相关文章:

  • docker 启动镜像命令集合
  • Unity自学之旅05
  • 【C++基础】多线程并发场景下的同步方法
  • 【设计模式-行为型】状态模式
  • vector的使用,以及部分功能的模拟实现(C++)
  • 2025.1.20——一、[RCTF2015]EasySQL1 二次注入|报错注入|代码审计
  • Amazon Redshift实用命令语句
  • docker启动服务占用172.18网段怎么改成其他网段?和网桥有关吗?或者怎么改docker-compose启动用的yml文件
  • 理解深度学习pytorch框架中的线性层
  • AWS 签名算法SigV4 的python实现
  • Oracle Agile PLM Web Service Java示例测试开发(一)环境环境、准备说明
  • easyexcel读取写入excel easyexceldemo
  • 梯度下降法 (Gradient Descent) 算法详解及案例分析
  • 3、C#基于.net framework的应用开发实战编程 - 实现(三、二) - 编程手把手系列文章...
  • 如何高效、优雅地利用正则表达式
  • EtherCAT介绍和总线结构
  • 一文了解二叉树的遍历和线索二叉树
  • 微服务学习-SkyWalking 实时追踪服务链路
  • CTFSHOW-WEB入门-文件包含78-81
  • Spring WebFlux 和 Spring MVC 的主要区别是什么?
  • springboot使用ssl连接elasticsearch
  • 【开源免费】基于SpringBoot+Vue.JS校园失物招领系统(JAVA毕业设计)
  • FastExcel导入Excel详细步骤
  • MyBatis-Plus之常用注解
  • Java定时任务实现方案(二)——ScheduledExecutorService
  • C#通过SDK包与三菱PLC仿真通讯