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)
根据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)
| 归档时间: |
|
| 查看次数: |
11883 次 |
| 最近记录: |