使用Pandas to_sql结合SQLAlchemy Core写入Postgres时的多Schema问题
解决SQLAlchemy Core + Pandas to_sql 写入PostgreSQL指定Schema的问题
问题根源
你用SQLAlchemy在abn schema下创建了带复合主键的表,但Pandas的to_sql方法默认不会识别你在MetaData中指定的schema,它会自动使用PostgreSQL默认的public schema创建新表(无约束),并将数据写入这个public表,导致abn.eshc_underlyers为空,而public.eshc_underlyers重复插入数据。
解决步骤
1. 给to_sql显式指定schema参数
修改你的to_sql调用,添加schema='abn'参数,让数据直接写入你预先创建好的abn.eshc_underlyers表:
with engine.connect() as conn: strUlDf.to_sql( name='eshc_underlyers', con=conn, schema='abn', # 新增这一行 if_exists='append', index=False )
2. 清理多余的public表
如果已经生成了不需要的public.eshc_underlyers表,可以执行SQL命令删除:
DROP TABLE public.eshc_underlyers;
3. 可选:设置连接默认schema(简化后续操作)
可以在创建engine时指定search_path,让PostgreSQL默认优先使用abn schema,这样后续的SQLAlchemy和Pandas操作都不用每次指定schema:
engine = db.create_engine( f'postgresql://data-catalogue:{dbpwd}@postgres-data-catalogue-dev/data-catalogue', connect_args={'options': '-csearch_path=abn,public'} )
设置后,metadata.create_all(engine)和to_sql都会默认使用abn schema,除非你显式指定其他schema。
验证
执行修改后的脚本后,检查abn.eshc_underlyers表,应该能看到插入的数据,且复合主键约束会生效——重复执行脚本时,主键冲突会触发报错(如果需要处理冲突,可以调整if_exists参数或添加冲突处理逻辑)。
内容的提问来源于stack exchange,提问作者Alex Lansley
相关产品推荐
相关产品推荐

