Pandas to_sql设置if_exists='append'写入MySQL仍报已存在错误
问题原因
- 你创建SQLAlchemy连接时没有将目标数据库
my_database写入连接URI,而是通过手动执行USE my_database语句切换当前会话的数据库,这是触发报错的核心原因。 - Pandas v1.3.4的
to_sql方法校验目标表是否存在时,调用的SQLAlchemy原生has_table接口默认会查询连接URI对应的默认数据库,不会识别你手动切换后的当前库。 - 首次执行
to_sql时,你已经切换到my_database,建表操作正常完成;第二次执行时,has_table在默认库找不到test_table,就会判定表不存在,触发CREATE TABLE建表逻辑,而当前会话实际在my_database下,该库已经存在test_table,因此抛出1050表已存在错误。 - 该逻辑在SQLite下能正常运行,是因为SQLite没有多数据库的概念,不存在校验范围不匹配的问题。
解决方案
方案1:将目标库写入连接URI(推荐)
直接在连接串中指定目标数据库,不需要再单独执行USE语句,可完全规避校验不匹配问题:
from sqlalchemy import create_engine import pymysql import pandas as pd # 连接URI中加入/my_database指定目标库 sqlEngine = create_engine('mysql+pymysql://username:password@127.0.0.1/my_database', pool_recycle=3600) con = sqlEngine.connect()
后续调用to_sql无需修改其他参数,if_exists='append'即可正常追加数据。
方案2:显式指定schema参数
如果你的业务场景需要同一个连接动态切换不同数据库,可以在调用to_sql时通过schema参数显式指定目标库:
entry.to_sql('test_table', con, if_exists='append', schema='my_database')
内容的提问来源于stack exchange,提问作者ollerend
相关产品推荐
相关产品推荐

