sqlalchemy 使用哪个确切的驱动程序?

Which exact driver is sqlalchemy using?

我在使用 pyinstaller 时遇到 MS SQL 连接问题。当 运行 处于交互模式时,一切都按预期进行。编译为 exe 后,MS SQL 数据库连接在第一次查询时超时并出现以下错误:

(pyodbc.OperationalError) ('08001', '[08001] [Microsoft][ODBC Driver 17 for SQL Server]Named Pipes Provider: Could not open a connection to SQL Server [53]. (53) (SQLDriverConnect); [08001] [Microsoft][ODBC Driver 17 for SQL Server]Login timeout expire (0); ...

我的连接字符串类似于以下内容:

create_engine(
"mssql+pyodbc://USER:PASSWORD@SERVERIP/DB_NAME?driver=ODBC+Driver+17+for+SQL+Server"
)

在尝试诊断问题时,我使用 pyodbc.drivers() 打印出可用于 pyodbc 的驱动程序(这表明编译和交互中的可用驱动程序之间存在很大差异)以及正在使用的驱动程序使用

print(session.bind.dialect.name)
> pyodbc
print(session.bind.dialect.driver)
> mssql

它 returns 正在使用的上层 python 模块,而不是在较低层处理它的 .dll。有什么方法可以找到正在使用的确切驱动程序吗?对于可能导致编译版本中的错误的任何提示,我们也将不胜感激。

问题可能出在您的连接字符串中。

要创建正确的连接字符串以使用 sqlAlchemy 连接到 MSSQL Server ODBC 驱动程序,请使用以下命令:

import urllib
from sqlalchemy import create_engine

server = 'serverName\instanceName,port' # to specify an alternate port
database = 'mydb' 
username = 'myusername' 
password = 'mypassword'

params = urllib.parse.quote_plus('DRIVER={ODBC Driver 17 for SQL Server};SERVER='+server+';DATABASE='+database+';UID='+username+';PWD='+password)

engine = create_engine("mssql+pyodbc:///?odbc_connect=%s" % params)

另外,您可以查看以下文章Connecting to Microsoft SQL Server using SQLAlchemy and PyODBC

Is there any way to find which exact driver [.dll] is being used?

import pyodbc

cnxn = engine.raw_connection()
print(cnxn.getinfo(pyodbc.SQL_DRIVER_NAME))  # msodbcsql17.dll
print(cnxn.getinfo(pyodbc.SQL_DRIVER_VER))  # 17.08.0001