如何使用Python将dataframe中的数据更新至对应数据库表
实现DataFrame更新到数据表的操作方法
首先需要安装依赖库,根据你使用的数据库类型选择对应的驱动,以MySQL为例:
- 安装命令:
pip install pandas sqlalchemy pymysql
其他数据库替换对应驱动即可:PostgreSQL用psycopg2-binary,SQL Server用pymssql。
第一步:创建数据库连接
import pandas as pd from sqlalchemy import create_engine, text # 连接串格式:数据库驱动://用户名:密码@数据库地址:端口/库名 engine = create_engine('mysql+pymysql://your_username:your_password@127.0.0.1:3306/your_db_name')
场景1:全量覆盖/追加写入目标表
直接使用pandas自带的to_sql方法即可实现:
df.to_sql( name="your_target_table", # 目标表名 con=engine, if_exists="replace", # 写入规则:replace=全量覆盖旧表,append=追加到旧表末尾,fail=表存在就报错 index=False, # 不写入DataFrame的索引列 chunksize=1000 # 数据量大时分批写入,避免内存溢出 )
注意:追加写入时需要保证DataFrame的字段名、字段类型和目标表完全一致,否则会抛出异常。
场景2:按主键增量更新(已有主键数据更新,无主键数据插入)
to_sql原生不支持增量更新,可通过两种方式实现:
方式1:先删后插(适合小数据量场景)
# 假设主键字段为id,先删除目标表中和当前DataFrame主键重复的旧数据 pk_list = df["id"].tolist() with engine.connect() as conn: conn.execute( text(f"DELETE FROM your_target_table WHERE id IN ({','.join(['%s']*len(pk_list))})"), tuple(pk_list) ) conn.commit() # 再写入新数据 df.to_sql(name="your_target_table", con=engine, if_exists="append", index=False)
方式2:使用数据库原生UPSERT语法(性能更高,适合大数据量)
不同数据库语法略有差异,以MySQL的ON DUPLICATE KEY UPDATE为例:
# 拼接SQL语句 cols = ", ".join(df.columns) placeholders = ", ".join(["%s"] * len(df.columns)) # 主键之外的字段触发更新时覆盖为新值 update_logic = ", ".join([f"{col}=VALUES({col})" for col in df.columns if col != "id"]) upsert_sql = f""" INSERT INTO your_target_table ({cols}) VALUES ({placeholders}) ON DUPLICATE KEY UPDATE {update_logic} """ # 批量执行 data_list = df.values.tolist() with engine.connect() as conn: conn.execute(text(upsert_sql), data_list) conn.commit()
如果是PostgreSQL,将更新逻辑替换为ON CONFLICT (id) DO UPDATE SET语法即可,SQL Server使用MERGE语法实现。
内容的提问来源于stack exchange,提问作者Naren
相关产品推荐
相关产品推荐

