pandas调用to_sql写入SQL Server报sqlite_master对象无效错误
错误原因
pandas.DataFrame.to_sql默认将传入的非SQLAlchemy连接对象识别为SQLite连接,自动生成SQLite方言的SQL语句执行。你传入的是pyodbc直连SQL Server的原生连接对象,pandas执行表存在性检查时会查询SQLite专属的系统表sqlite_master,但SQL Server中不存在这个系统对象,因此抛出"Invalid object name 'sqlite_master'"的错误。
解决方法
使用pandas官方推荐的SQLAlchemy引擎作为数据库连接对象,pandas会自动适配SQL Server的SQL方言,不再生成SQLite专属的查询语句。
- 先安装所需依赖:
pip install pandas sqlalchemy pyodbc
- 修改代码中的连接逻辑,替换原生pyodbc连接为SQLAlchemy引擎:
import pandas as pd from sqlalchemy import create_engine # 拼接SQLAlchemy格式的SQL Server连接字符串 conn_str = ( r"mssql+pyodbc://DESKTOP-A1DUCDS\SQLEXPRESS/Northwind?" r"driver=SQL Server;" r"Trusted_Connection=yes" ) engine = create_engine(conn_str) # 读取数据 df = pd.read_sql_query("SELECT * FROM Orders", engine) print(df) # 写入新表,可通过if_exists参数控制表已存在时的行为:fail/append/replace df.to_sql("Orders_New", con=engine, index=False, if_exists="fail")
注意事项
- 如果写入过程中出现字段类型不匹配的报错,可以在
to_sql方法中通过dtype参数手动指定字段对应的SQL Server类型,避免自动类型推断错误。 - 不建议绕过SQLAlchemy直接使用原生pyodbc连接调用
to_sql,后续版本的pandas已经逐步废弃对非SQLAlchemy连接的支持。
内容的提问来源于stack exchange,提问作者user18740051
相关产品推荐
相关产品推荐

