繁体   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