无法将DataFrame写入SQL Server,报错sqlite_master对象无效
执行代码
import pyodbc import pandas as pd # Connect to the database conn = pyodbc.connect("Driver={SQL Server}; "Server=servername; "Database=databasename; "Trusted_Connection=yes;") # Create the table cursor = conn.cursor() cursor.execute("CREATE TABLE emails (email VARCHAR(255))") # Write the DataFrame to the database df.to_sql("emails", conn, if_exists="replace", index=False) # Commit the transaction conn.commit() # Close the connection conn.close()
报错信息
ProgrammingError: ('42S02', "[42S02] [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid object name 'sqlite_master'. (208) (SQLExecDirectW); [42S02] [Microsoft][ODBC SQL Server Driver][SQL Server]Statement(s) could not be prepared. (8180)")
DatabaseError: Execution failed on sql 'SELECT name FROM sqlite_master WHERE type='table' AND name=?;': ('42S02', "[42S02] [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid object name 'sqlite_master'. (208) (SQLExecDirectW); [42S02] [Microsoft][ODBC SQL Server Driver][SQL Server]Statement(s) could not be prepared. (8180)")
已尝试安装ODBC Driver 18并在连接字符串添加TrustServerCertificate=YES;,仍出现相同错误。疑问:
- 哪里操作有误?
- 如何检查pyodbc是否正确安装?
- 是否需要更换驱动及如何安装?
错误原因
df.to_sql()默认采用SQLite语法检查表是否存在,但SQL Server使用的是sys.tables系统表而非SQLite的sqlite_master。问题核心在于:直接使用pyodbc连接时,to_sql无法自动适配SQL Server语法,必须配合SQLAlchemy引擎才能实现跨数据库语法兼容。
修正步骤
1. 安装SQLAlchemy
执行以下命令安装依赖包:
pip install sqlalchemy
2. 修改代码适配SQL Server
用SQLAlchemy创建连接引擎,替代原生pyodbc连接,让to_sql自动适配SQL Server语法:
import pandas as pd from sqlalchemy import create_engine # 构建SQLAlchemy连接字符串,适配ODBC Driver 18 connection_string = "mssql+pyodbc://@servername/databasename?driver=ODBC+Driver+18+for+SQL+Server&Trusted_Connection=yes&TrustServerCertificate=yes" engine = create_engine(connection_string) # 直接写入数据,if_exists="replace"会自动处理表的创建/替换 df.to_sql("emails", engine, if_exists="replace", index=False) # 关闭引擎连接 engine.dispose()
说明:
- 无需手动执行
CREATE TABLE,if_exists="replace"会自动删除旧表并重建;若需追加数据,可改为if_exists="append" - 连接字符串中的
driver需与安装的驱动版本对应,如使用ODBC Driver 17则改为ODBC+Driver+17+for+SQL+Server
3. 检查pyodbc安装状态
命令行验证
执行以下命令,若能输出pyodbc版本信息则安装正常:
pip show pyodbc
代码验证
在Python交互环境中运行以下代码,若输出"连接成功"则pyodbc可正常连接SQL Server:
import pyodbc print(pyodbc.version) # 测试数据库连接 conn = pyodbc.connect("Driver={ODBC Driver 18 for SQL Server};Server=servername;Database=databasename;Trusted_Connection=yes;TrustServerCertificate=yes") print("连接成功") conn.close()
4. 驱动选择与安装
推荐使用微软官方的ODBC Driver 17/18 for SQL Server,替代老旧的{SQL Server}驱动:
- 安装方式:前往微软官网搜索"ODBC Driver for SQL Server",下载对应系统版本安装包执行安装
- 验证驱动:Windows系统可打开
odbcad32.exe(ODBC数据源管理器),在"驱动"标签页查看是否存在对应版本的驱动 - 连接字符串适配:确保连接字符串中的
driver参数与安装的驱动名称完全一致,如{ODBC Driver 18 for SQL Server}
内容的提问来源于stack exchange,提问作者Lehas123

