簡體   English   中英

如何使用 sqlalchemy+pyodbc 和 MS SQL Server 中的多個數據庫為 pandas read_sql 創建 sql alchemy 連接?

[英]How to create sql alchemy connection for pandas read_sql with sqlalchemy+pyodbc and multiple databases in MS SQL Server?

我正在嘗試使用“pandas.read_sql_query”將數據從 MS SQL Server 復制到 pandas DataFrame。 我需要在我的 SQL 查詢中進行多個連接。 正在連接的表在同一台服務器上,但在不同的數據庫中。 我傳遞給 pandas 的查詢在 MS SQL Server Management Studio 中運行良好。 在 Jupyter Notebook 中,我嘗試像這樣查詢數據(為了使事情可讀,查詢本身被簡化為僅 2 個連接並使用通用名稱):

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)

因此,我找到了一種解決方法:使用pymssql代替pyodbc(在import語句和引擎中)。 它使您可以使用數據庫名稱構建聯接,而無需在引擎中指定聯接。 在這種情況下,無需指定驅動程序。

如果您正在使用pymssql官方尚不支持的Python 3.6,可能會出現問題,但是您可以在此處找到適用於Python 3.6的非官方工具。 它可以像我的查詢一樣工作。

這是帶有連接的原始代碼,已重建以與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)

至於非官方的wheel,您需要從我上面給出的鏈接中下載Python 3.6的文件,然后將cd下載到下載文件夾並運行pip install wheels ,其中“ 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)

以下代碼對我有用。 我正在使用帶有 SQLAlchemy 的 SQL 服務器

import pyodbc
import pandas as pd
cnxn = pyodbc.connect('DRIVER=ODBC Driver 17 for SQL Server;SERVER=your_db_server_id,your_db_server_port;DATABASE=Vanguard;UID=your_db_username;PWD=your_db_password')
query = "SELECT * FROM database.tablename;"
df = pd.read_sql(query, cnxn)
print(df)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM