使用to_sql函数时出错:SQL提取数据正常但写入失败
解决pandas to_sql写入SQL Server失败的问题
嘿,我看你遇到的问题挺常见的,给你拆解几个最可能的原因和对应的解决办法:
1. 先改Schema!你用错PostgreSQL的习惯了
SQL Server里默认的架构是dbo,而不是public(那是PostgreSQL的默认架构)。你写的schema='public'会让SQL Server找不到对应的架构,这大概率是报错的核心原因。直接把这个改成schema='dbo',或者干脆去掉schema参数(因为默认就是dbo)。
修改后的写入代码:
# 改schema的版本 df.to_sql('test', schema='dbo', con=cnxn, index=False, if_exists='replace') # 或者更省心,去掉schema参数 df.to_sql('test', con=cnxn, index=False, if_exists='replace')
2. 别直接用pyodbc连接,换SQLAlchemy引擎更稳
Pandas的to_sql对pyodbc直接连接的支持不算完美,尤其是针对SQL Server。更稳妥的方式是用SQLAlchemy创建连接引擎,能避免很多奇怪的兼容性问题。
步骤很简单:
- 先装SQLAlchemy(没装的话跑这个命令):
pip install sqlalchemy - 然后用SQLAlchemy的连接字符串来操作:
from sqlalchemy import create_engine import pandas as pd # 构建符合要求的连接字符串 conn_str = ( "mssql+pyodbc://DESKTOP-5422GFU/Python_Data?" "driver=SQL+Server+Native+Client+11.0&" "Trusted_Connection=yes" ) engine = create_engine(conn_str) # 读取数据(用引擎也可以,和pyodbc连接一样顺畅) df = pd.read_sql_query('select * from Persons', engine) # 写入数据,这下就不容易出错了 df.to_sql('test', schema='dbo', con=engine, index=False, if_exists='replace')
3. 查一查账号权限够不够
确认你用的User账号有对Python_Data数据库的CREATE TABLE、ALTER TABLE权限,不然代码再对,数据库也会拒绝写入。可以在SQL Server Management Studio里给账号赋权,或者找DBA帮忙搞定。
4. 把完整错误信息找出来
你说错误提示只显示了‘Dat...’,如果上面的方法都没解决,建议把完整的错误信息贴出来——比如是数据类型不匹配(Data type mismatch)还是权限不足(Permission denied)?要是数据类型的问题,还可以手动指定dtype参数来匹配SQL Server的类型。
举个例子,如果你的DataFrame里有日期类型的列,就可以这么指定:
from sqlalchemy.types import DateTime df.to_sql('test', schema='dbo', con=engine, index=False, if_exists='replace', dtype={'你的日期列名': DateTime()})
内容的提问来源于stack exchange,提问作者Shawn
相关产品推荐
相关产品推荐

