如何使用Pandas将DataFrame写入Azure SQL数据库?
如何用Pandas将DataFrame写入Azure SQL数据库?
问题场景
读取Azure SQL数据的操作正常,但执行df.to_sql()写入时触发错误:
读取数据的可运行代码:
import pyodbc import pandas as pd server = 'myserver.database.windows.net' database = 'mydatabase' username = 'DefinitelyNotAdmin' password = 'DefinitelyNotPassword' driver= 'ODBC Driver 17 for SQL Server' cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER='+server+';DATABASE='+database+';UID='+username+';PWD='+ password) cursor = cnxn.cursor() sqlcmd = "SELECT TOP (1000) * FROM information_schema.tables" df = pd.read_sql(sqlcmd, cnxn)
执行写入操作的代码:
df.to_sql('test', cnxn, schema='lz')
触发的错误信息:
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)")
错误原因
Pandas的to_sql()方法直接使用pyodbc连接时,默认采用SQLite的语法逻辑检测目标表是否存在,但Azure SQL属于SQL Server体系,不存在sqlite_master系统表,因此触发语法错误。
解决方法
使用SQLAlchemy创建数据库连接引擎,Pandas会根据引擎类型自动适配对应数据库的语法:
- 先安装依赖包(未安装时执行):
pip install sqlalchemy pyodbc
- 修改代码,用SQLAlchemy构建连接并执行写入:
import pandas as pd from sqlalchemy import create_engine server = 'myserver.database.windows.net' database = 'mydatabase' username = 'DefinitelyNotAdmin' password = 'DefinitelyNotPassword' driver = 'ODBC Driver 17 for SQL Server' # 构建SQLAlchemy连接字符串 connection_string = f'mssql+pyodbc://{username}:{password}@{server}/{database}?driver={driver.replace(" ", "+")}' engine = create_engine(connection_string) # 执行写入操作,可通过if_exists参数控制表已存在时的行为 df.to_sql('test', engine, schema='lz', if_exists='replace', index=False)
关键参数说明
if_exists:可选值为replace(替换现有表)、append(追加数据)、fail(表存在则报错),按需选择。index=False:避免将DataFrame的索引列写入数据库,若需保留索引可移除该参数。
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

