使用Pandas向PostgreSQL上传数据时避免覆盖原有数据的方法
解决Pandas向PostgreSQL追加时序数据不覆盖的问题
问题场景
你用Pandas向PostgreSQL的tableTest表上传时序数据时,原代码里if_exists='replace'会直接覆盖表中原有数据,尝试设置if_exists='True'却无法实现新增数据的需求(你的时序数据日期和值均唯一)。原代码如下:
import psycopg2 import pandas as pd from sqlalchemy import create_engine user = 'aaa' passw= 'bbb' host = 'ccc' database = 'ddd' conn_string = f'postgresql://{user}:{passw}@{host}/{database}' df = pd.read_csv('20220817.csv') db = create_engine(conn_string) conn = db.connect() table = 'tableTest' df.to_sql(table, con=conn, if_exists='replace', index=False) conn.close()
解决方法
你搞错了df.to_sql()的if_exists参数取值——这个参数的有效选项是'fail'、'replace'、'append',根本没有'True'这个值。要实现追加数据、不覆盖原有内容,只需要把参数改成'append'即可:
修改后的完整代码:
import psycopg2 import pandas as pd from sqlalchemy import create_engine user = 'aaa' passw= 'bbb' host = 'ccc' database = 'ddd' conn_string = f'postgresql://{user}:{passw}@{host}/{database}' df = pd.read_csv('20220817.csv') db = create_engine(conn_string) conn = db.connect() table = 'tableTest' # 用append模式追加数据,保留原有内容 df.to_sql(table, con=conn, if_exists='append', index=False) conn.close()
可选优化(针对潜在重复数据)
如果后续可能上传重复的时序数据(比如误传了同一日期的记录),可以先对DataFrame做去重处理,再执行追加:
# 假设你的日期列名为'date',根据该列去重,保留最新的一条记录 df = df.drop_duplicates(subset=['date'], keep='last')
内容的提问来源于stack exchange,提问作者Lleims
相关产品推荐
相关产品推荐

