2017-04-25 43 views
1

我正在嘗試使用'pandas.read_sql_query'將數據從MS SQL Server複製到一個pandas DataFrame中。我需要在我的SQL查詢中執行多個連接。加入的表位於同一臺服務器上,但位於不同的數據庫中。我傳遞給熊貓的查詢在MS SQL Server Management Studio中正常工作。在Jupyter筆記本我想查詢像數據,以便(使事情可讀查詢本身就被簡化爲2聯接和通用名稱使用):如何使用sqlalchemy + pyodbc和MS SQL Server中的多個數據庫爲pandas read_sql創建sql鍊金術連接?

import pandas as pd 
import sqlalchemy as sql 
import pyodbc 

server = '100.10.10.10' 
driver = 'SQL+Server+Native+Client+11.0' 
myQuery = '''SELECT first.Field1, second.Field2 
      FROM db1.schema.Table1 AS first 
      JOIN db2.schema.Table2 AS second 
      ON first.Id = second.FirstId 
      ''' 
engine = sql.create_engine('mssql+pyodbc://{}?driver={}'.format(server, driver)) 
df = pd.read_sql_query(myQuery, engine) 

這並不工作,並返回一個錯誤:

DBAPIError: (pyodbc.Error) ('IM010', '[IM010] [Microsoft][��������� ��������� ODBC] ������� ������� ��� ��������� ������ (0) (SQLDriverConnect)') 

看來這個問題是不包括有關數據庫信息的引擎,因爲一切工作正常使用下一個樣的代碼,在那裏我包括數據庫引擎:

myQuery = 'select Field1 from schema.Table1' 
db = 'db1' 
engine = sql.create_engine('mssql+pyodbc://{}/{}?driver={}'.format(server, db, driver)) 
df = pd.read_sql_query(myQuery, engine) 

但像破裂的代碼上面加入,如果我不包括在引擎數據庫,但它添加到查詢就像這樣:

myQuery = 'select Field1 from db1.schema.Table1' 
engine = sql.create_engine('mssql+pyodbc://{}?driver={}'.format(server, 
driver)) 
df = pd.read_sql_query(myQuery, engine) 

所以,我應該怎麼指定pandas.read_sql_query「SQL」和當我需要連接來自不同數據庫但同一服務器的表時,這種情況下,'con'參數在 ?

P.S.我只能讀取訪問此服務器的連接。我無法創建新的表格或視圖或類似的東西。

更新: MS SQL Server版本是2008 R2。

更新2:我使用Python 3.6和Windows 10

+0

什麼是您的MS SQL Server版本? – MaxU

+0

@MaxU它是2008 R2。 –

+0

嘗試'SQL +服務器+本機+客戶端+ 10.0'作爲驅動程序... [相關問題](http:// stackoverflow。com/a/41729710/5741205) – MaxU

回答

2

所以我已經找到了解決辦法:使用pymssql代替pyodbc(無論是在import語句並在發動機)。它使您可以使用數據庫名稱建立連接,而無需在引擎中指定它們。在這種情況下不需要指定驅動程序。

如果您正在使用python 3.6,但它可能還存在一個問題,但您可以在Python 3.6 here中找到非官方的輪子。它的工作原理與我的查詢一致。

這裏是原來的代碼連接,重建與pymssql工作:

import pandas as pd 
import sqlalchemy as sql 
import pymssql 

server = '100.10.10.10' 
myQuery = '''SELECT first.Field1, second.Field2 
      FROM db1.schema.Table1 AS first 
      JOIN db2.schema.Table2 AS second 
      ON first.Id = second.FirstId''' 
engine = sql.create_engine('mssql+pymssql://{}'.format(server)) 
df = pd.read_sql_query(myQuery, engine) 

至於非官方輪,你需要從我上面給的鏈接,然後cd到下載文件的Python 3.6下載文件夾並運行pip install wheels其中'wheels'是車輪文件的名稱。

更新:

實際上,也可以使用pyodbc。我不確定這是否適用於任何SQL Server安裝程序,但是在將'master'設置爲引擎中的數據庫後,一切都適用於我。生成的代碼如下所示:

import pandas as pd 
import sqlalchemy as sql 
import pyodbc 

server = '100.10.10.10' 
driver = 'SQL+Server' 
db = 'master' 
myQuery = '''SELECT first.Field1, second.Field2 
      FROM db1.schema.Table1 AS first 
      JOIN db2.schema.Table2 AS second 
      ON first.Id = second.FirstId''' 
engine = sql.create_engine('mssql+pyodbc://{}/{}?driver={}'.format(server, db, driver)) 
df = pd.read_sql_query(myQuery, engine)