to_sql熊猫数据帧转换为SQL Server错误:DatabaseError

Ale*_*xSB 5 python sql dataframe python-2.7 pandas

尝试将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本机客户端11.0] [SQL Server]声明无法准备。(8180)“)

似乎pandas正在寻找sqlite而不是真正的数据库。

这不是一个连接问题,因为我可以从阅读sql-server与使用相同的连接pandas.read_sql 已使用设置连接

sqlalchemy.create_engine("mssql+pyodbc:///?odbc_connect=%s" % params)
Run Code Online (Sandbox Code Playgroud)

这也不是数据库权限问题,因为我可以使用与以下相同的连接参数逐行编写:

cursor = conn.cursor()
cursor.execute('insert into test values (1, 'test', 10)')
conn.commit()
Run Code Online (Sandbox Code Playgroud)

我可以编写一个循环逐行插入一个循环,但是我想知道为什么to_sql它对我不起作用,我深信它不会那么有效。

环境:: Python2.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)
Run Code Online (Sandbox Code Playgroud)

Scr*_*urr 6

根据to_sql文档,该con参数可以是SQLAchemy引擎或旧版DBAPI2连接(sqlite3)。因为要传递连接对象而不是SQLAlchemy引擎对象作为参数,所以pandas推断您正在传递DBAPI2连接或SQLite3连接,因为它仅支持该连接。要解决此问题,请执行以下操作:

myeng = sqlalchemy.create_engine("mssql+pyodbc:///?odbc_connect=%s" % params)

# Code to create your df
...

# Now write to DB
df.to_sql('table', myeng, index=False)
Run Code Online (Sandbox Code Playgroud)