2017-07-26 89 views
2

在試圖寫一個pandas「據幀到sql-server,我得到這個錯誤:to_sql大熊貓數據幀到SQL服務器錯誤:DatabaseError

DatabaseError: Execution failed on sql 'SELECT name FROM sqlite_master WHERE type='table' AND name=?;': ('42S02', "[42S02] [Microsoft][SQL Server Native Client 11.0][SQL Server]Invalid object name 'sqlite_master'. (208) (SQLExecDirectW); [42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]Statement(s) could not be prepared. (8180)")

看來pandas正在考慮sqlite,而不是真實的數據庫。

它不是一個連接問題,因爲我可以從sql-server使用pandas.read_sql 連接相同的連接讀取已使用

​​

這不是一個數據庫的權限問題,或者因爲我可以通過線寫線設置使用相同的連接參數:

cursor = conn.cursor() 
cursor.execute('insert into test values (1, 'test', 10)') 
conn.commit() 

我可以只寫一個循環由線到instert線,但我想知道爲什麼to_sql是不是w ^爲我而言,我擔心它不會那麼高效。

環境: 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]) 

test.to_sql("dbo.test", con=engine, if_exists="append", index=False) 
+0

你爲什麼想查詢一個叫表'使用SQL Server sqlite_master'?無論你,我,還是我們兩個都在這裏失去了一些東西。 –

+0

你是怎麼調用'to_sql'的?你是否將SQLAlchemy引擎作爲[第二個參數](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_sql.html)傳遞? – unutbu

+0

嘿!不,我不是......我只是運行'df.to_sql(「dbo.test」,con = conn,if_exists =「append」)',熊貓自動搜索sqlite_master;我不知道爲什麼!哪裏'conn = engine.connect()。connection' – AlexSB

回答

1

根據該to_sql doc,所述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) 
+0

感謝您的回答。事實上,這是我嘗試的第一件事,但我得到了以下錯誤:'AttributeError:'Engine'對象沒有屬性'cursor''。我將不勝感激任何解決方法。 – AlexSB

+0

嗯,試一下'conn = myeng.connect()',然後將它作爲連接對象傳遞呢?我沒有任何麻煩,將'myeng'作爲參數傳遞給我,但是我使用'SQL Server的ODBC驅動程序13'作爲我的ODBC驅動程序,所以它可能是驅動程序之間的細微差別。 –

+0

同樣的結果...我也嘗試過'engine.raw_connection()',我在另一篇文章中讀到並得到了相同的結果。另外,我嘗試將驅動程序更改爲'[SQL Server]'和[ODBC驅動程序11 for SQL Server]',但沒有任何運氣...... – AlexSB

0

所以我遇到了同樣的事情。我試圖查看代碼,無法弄清楚它爲什麼不能正常工作,但它看起來像卡住了這個電話。

pd.io.sql._is_sqlalchemy_connectable(engine) 

我發現,如果我跑這首返回true,但只要我跑df.to_sql後,運行它()返回False。現在我正在運行它,然後執行df.to_sql(),它實際上可以工作。

希望這會有所幫助。

0

試試這個。 好連接MS SQL服務器(SQL身份驗證)和更新數據

from sqlalchemy import create_engine 
params = urllib.parse.quote_plus(
'DRIVER={ODBC Driver 13 for SQL Server};'+ 
'SERVER='+server+';DATABASE='+database+';UID='+username+';PWD='+ password) 

engine = create_engine("mssql+pyodbc:///?odbc_connect=%s" % params) 

#df: pandas.dataframe; mTableName:table name in MS SQL 
#warning: discard old table if exists 
df.to_sql(mTableName, con=engine, if_exists='replace', index=False)