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

Python写入PostgreSQL表的三种实现方法

这里使用Python的psycopg2库作为写入PostgreSQL表的驱动。写入的方法主要包括INSERT INTO语句方法;使用pandas.DataFrame的to_sql方法直接写入;COPY高性能写入方式。

使用INSERT INTO方式写入的实现如下:

import psycopg2 as pg
from psycopg2 import extras# 连接数据库
conn = pg.connect(database='db_name',user='user_name',password='password',host='pg_server',port=5432
)
cur = conn.cursor()# 插入一条数据
sql1 = "INSERT INTO users (id, name, age) VALUES (%s, %s, %s);"
cur.execute(sql1, (1, "Alice", 25))# 循环多次插入多条数据
rows_data = [(2, "Bob", 30),(3, "Charlie", 28),(4, "Diana", 22)
]
sql2 = "INSERT INTO users (id, name, age) VALUES (%s, %s, %s);"
cur.executemany(sql2, rows_data)  # 循环执行INSERT,多少条执行多少次# 一次插入多条数据
sql3 = "INSERT INTO users (id, name, age) VALUES %s"
extras.execute_values(cur, sql3, rows_data)# 提交事务
conn.commit()
# 关闭连接
cur.close()
conn.close()
# 不建议f"INSERT INTO users (id, name, age) VALUES ({id}, '{name}', {age})"拼接语句

借助数据库操作桥梁sqlalchemy库,使用pandas.DataFrame.to_sql写入PG表如下:

import pandas as pd
from sqlalchemy import create_engine# 假设你有一个 DataFrame
rows_data = {"id": [1, 2, 3],"name": ["Alice", "Bob", "Charlie"],"age": [25, 30, 28]
}
df = pd.DataFrame(data)
engine = create_engine("postgresql+psycopg2://user:pswd@server:5432/db_name")
# 按列名写入,非顺序
# if_exists参数:默认fail即表存在则报错,replace即删除表数据后插入,append即追加
# chunksize:一次性写入行数,method为None时这里的行数为10也是10个insert每行一个insert
# method:None即每行一个insert语句;'multi':表示一个insert多个values;也支持自定义写入函数
# index参数:是否将索引列写入数据库表中,False不插入
df.to_sql('tb_name', engine, if_exists='append', index=False, chunksize=10)

使用COPY方法写入如下:

# 使用前面生成的连接对象cur和DataFrame对象df
# 下面采用COPY方式写入,首先格式化输入流,然后写入到PG库
buffer = StringIO()
# noinspection PyTypeChecker
df.to_csv(buffer, sep='\1', na_rep='', header=False, index=False)
buffer.seek(0)  # 游标定位到开始,默认是末尾
table_name = 'tb_name'
table_columns = ','.join(df.columns)
sql = f"COPY {table_name}({table_columns}) FROM STDIN (FORMAT CSV, DELIMITER '\1', NULL '')"
cur.copy_expert(sql, buffer)  # 另有copy_from方法
conn.commit()
cur.close()
conn.close()

COPY的优点是速度快,资源开销低。缺点是不支持更新逻辑(比如UPSERT),事务回滚成本大。所以一般大数据量(比如单次几十上百万以上量级)场景用COPY,其他场景用前两种方式即可。

http://www.dtcms.com/a/411314.html

相关文章:

  • 聊聊UI自动化测试有哪些优势
  • 想自己做网站推广淘宝做动效代码的网站
  • 做一个能注册用户的网站空间设计师工资一般多少
  • 【精品资料鉴赏】解读145页 PPT汽车集团数字化转型互联网+顶层战略设计方案
  • 环签名:AOS Borromean
  • 自适应平台(Adaptive Platform)标准——Specification of Time Synchronization
  • 制作网站的知识网站访客qq获取系统 报价
  • tcpdump 使用详解
  • 新余 网站建设公司上海黄浦网站建设
  • 数据采集技术:02 有关离线采集
  • 【SCI一区】模糊斜率熵 Fuzzy Slope Entropy+状态分类、故障诊断!
  • 品牌网站解决方案vr全景网站怎么做
  • 科技有限公司 网站制作poedit2 汉化wordpress
  • 视频融合平台EasyCVR 构筑智慧交通可视化管理与智能决策中枢
  • 一个商城网站开发要多少时间内蒙中国建设银行招聘网站
  • 从图像到精准文字:基于PyTorch与CTC的端到端手写文本识别实战
  • 使用 PyTorch 实现 CIFAR-10 图像分类:从数据加载到模型训练全流程
  • 网站开发公司能否挣钱怎么在网站空间上传文件
  • 亭湖区建设局网站楼盘网站开发报价
  • java后端工程师进修ing(研一版‖day49)
  • opendds初入门之对inforepo模式运行探索
  • 简单公司网站最全的域名后缀
  • 比邻智联发布生活物联网家电应用白皮书和Cat.1模组新品
  • 第七章 Spring-Boot框架
  • 网站html静态化解决方案网站制作公司 北京
  • 金仓数据库实现电子证照系统从MongoDB平滑迁移,国产化替代迎来新典范
  • CAN总线学习(四)错误处理 STM32CAN外设一
  • 【OpenGL】LearnOpenGL学习笔记28 - 延迟渲染 Deferred Rendering
  • 莱芜梆子网站昆山网站建设需要多少钱
  • 站长交流装潢设计什么意思