如何使用sql alchemy+pyodbc和MS sql Server中的多个数据库为pandas read_sql创建sql炼金术连接?

2024-04-28 23:45:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用“pandas.read_sql_query”将数据从MS sql Server复制到pandas数据帧中。我需要在SQL查询中执行多个连接。要联接的表在同一服务器上,但在不同的数据库中。我传递给pandas的查询在MS SQL Server管理工作室内运行良好。在Jupyter笔记本中,我试图像这样查询数据(为了使内容可读,查询本身被简化为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)

这不起作用并返回错误:

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:我正在使用Python3.6和Windows10。


Tags: 数据数据库pandasreadsqlserverschemadriver
1条回答
网友
1楼 · 发布于 2024-04-28 23:45:40

所以我找到了一个解决方法:使用pymssql而不是pyodbc(在import语句和引擎中)。它允许您使用数据库名称构建连接,而无需在引擎中指定它们。在这种情况下不需要指定驱动程序。

如果您使用Python 3.6(pymssql暂时不支持它),可能会有问题,但是您可以找到python3.6here的非官方控制盘。它的工作方式和我的问题是一样的。

下面是使用连接重新生成的原始代码,以使用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)

至于非官方的wheels,您需要从我上面提供的链接下载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)

相关问题 更多 >