我在一个项目中使用 python,在该项目中我从 Azure SQL 数据库查询数据,然后将结果写回到同一个数据库。
我使用以下代码创建 SQLAlchemy 引擎:
connection_string = 'mssql+pyodbc://user:pwd@dsn'
engine = sqlalchemy.create_engine(connection_string)
运行查询时,我收到此错误:
InterfaceError: (pyodbc.InterfaceError) ('IM002', '[IM002] [Microsoft][ODBC 驱动程序管理器] 未找到数据源名称且未指定默认驱动程序 (0) (SQLDriverConnect)') (此错误的背景位于:https://sqlalche.me/e/20/rvf5)
令我困惑的是:
connection_url = sqlalchemy.URL.create()
方法直接适用于stg。所以可以用Python访问数据库。然而,由于我们的系统和这个项目的特定原因,我必须将上面的示例方法与 dsn 结合使用。知道问题出在哪里吗?看起来它与 stg dsn 配置有关,但由于它看起来与其他环境相同,所以我不知道问题是什么。
我必须自己连接到数据库,因此我已将自己添加到该组中。运行本地 Python 应用程序时,我仍然无法使用 Azure“给我”的连接字符串登录 - 其中包含
Authentication=ActiveDirectoryIntegrated
- 所以我想我必须找出原因。
(pyodbc.InterfaceError) ('IM002', '[IM002] [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified (0) (SQLDriverConnect)')
(Background on this error at: https://sqlalche.me/e/14/rvf5)
问题可能与连接字符串格式有关。您可以使用下面的连接字符串:
odbc_str = 'DRIVER='+driver+';SERVER='+server+';PORT=1433;UID='+username+';DATABASE='+ database + ';PWD='+ password
connect_str = 'mssql+pyodbc:///?odbc_connect=' + urllib.parse.quote_plus(odbc_str)
它将成功连接到Azure SQL数据库,没有任何错误。以下是完整代码供您参考:
import urllib
import sqlalchemy
import pandas as pd
sql_query = 'SELECT * FROM [dbo].[ticker]'
server = '<serverName>.database.windows.net'
database = '<databaseName>'
username = '<userName>'
password = '<password>'
driver = '{ODBC Driver 18 for SQL Server}'
odbc_str = 'DRIVER='+driver+';SERVER='+server+';PORT=1433;UID='+username+';DATABASE='+ database + ';PWD='+ password
connect_str = 'mssql+pyodbc:///?odbc_connect=' + urllib.parse.quote_plus(odbc_str)
engine = sqlalchemy.create_engine(connect_str)
df = pd.read_sql(sql_query, engine)
print(df)
对于上述代码,您将得到如下输出:
id | 名字 |
---|---|
100 | 股票代码 1 |
200 | 股票代码 2 |
300 | 股票代码 3 |
400 | 股票代码 4 |