【发布时间】:2018-01-01 17:19:00
【问题描述】:
在尝试将 pandas' 数据帧写入 sql-server 时,我收到此错误:
DatabaseError: 执行失败 sql 'SELECT name FROM sqlite_master WHERE type='table' AND name=?;': ('42S02', "[42S02] [Microsoft][SQL Server Native Client 11.0][SQL Server]无效的对象名称“sqlite_master”。(208) (SQLExecDirectW);[42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]无法准备语句。(8180)")
似乎pandas 正在查看sqlite 而不是真正的数据库。
这不是连接问题,因为我可以使用 pandas.read_sql 以相同的连接从 sql-server 读取数据
已使用
sqlalchemy.create_engine("mssql+pyodbc:///?odbc_connect=%s" % params)
这也不是数据库权限问题,因为我可以使用与以下相同的连接参数逐行编写:
cursor = conn.cursor()
cursor.execute('insert into test values (1, 'test', 10)')
conn.commit()
我可以写一个循环来逐行插入,但我想知道为什么to_sql 对我不起作用,我担心它不会那么高效。
环境:
Python: 2.7
Pandas: 0.20.1
sqlalchemy:1.1.12
提前致谢。
可运行示例:
import pandas as pd
from sqlalchemy import create_engine
import urllib
params = urllib.quote_plus("DRIVER={SQL Server Native Client 11.0};SERVER=
<servername>;DATABASE=<databasename>;UID=<username>;PWD=<password>")
engine = create_engine("mssql+pyodbc:///?odbc_connect=%s" % params)
test = pd.DataFrame({'col1':1, 'col2':'test', 'col3':10}, index=[0])
conn=engine.connect().connection
test.to_sql("dbo.test", con=conn, if_exists="append", index=False)
【问题讨论】:
-
你怎么打电话给
to_sql?您是否将 SQLAlchemy 引擎作为 the second argument 传递? -
嘿!不,我不是……我只是运行
df.to_sql("dbo.test", con=conn, if_exists="append"),pandas 会自动搜索 sqlite_master;我不知道为什么!在哪里conn=engine.connect().connection -
如果您可以发布一个简短的可运行示例来演示该问题,那将非常有帮助。这样我们就可以准确地看到一切是如何定义的,并查看哪一行正在生成什么错误消息。
-
@unutbu 查看已编辑问题的可运行示例。谢谢!
-
最后,我编写了循环逐行上传表格的代码,那里的错误比使用熊猫更清楚。基本上变量类型存在错误...如果我将所有 pandas 数据帧转换为字符串并将其上传到 sql varchar 表,则“pandas.to_sql”可以工作。我已经使用python 2 周了,所以我还不能提供有关格式错误的更多信息。 @unutbu @Scratch'N'Purr 都感谢您的帮助。
标签: python sql python-2.7 pandas dataframe