使用pyodbc+sqlalchemy方式连接SQL Server 在Windows环境下: 如何解决【[ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序】问题? 是否需要安装ODBC驱动? DSN如何使用?
使用pyodbc+sqlalchemy方式连接SQL Server
在Windows环境下:
如何解决【[ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序】问题?
是否需要安装ODBC驱动?
DSN如何使用?
仅使用pyodbc连接SQL Server
不创建DSN
最简单的方式如下:
import pyodbc
SERVER = '127.0.0.1'
DATABASE = 'AIS1624'
UID = 'sa'
PWD = '123456'
DRIVER = 'SQL Server'
conn = pyodbc.connect(DRIVER=DRIVER, SERVER=SERVER, DATABASE=DATABASE, UID=UID, PWD=PWD)
cursor = conn.cursor()
cursor.execute("SELECT TOP 10 * FROM ICSTOCKBILL")
row = cursor.fetchone()
while row:
print(row)
row = cursor.fetchone()
上述代码(格式)理论上在一般的环境都能运行成功,对环境的要求也是最简单的:
DRIVER = 'SQL Server' ——指pyodbc.connect()函数的DRIVER参数,也是指系统中已安装的ODBC驱动的版本,可以在【控制面板\系统和安全\管理工具】下的【ODBC 数据源(64 位)】中查看,在【名称】列出现的版本都可以填写。
SQL Server的驱动,所以DRIVER = 'SQL Server'一般都是OK的,当然,要以实际情况为准,如果没有,则需要安装ODBC Driver。
如果实际同时也安装了ODBC Driver 17 for SQL Server,那么使用DRIVER = 'ODBC Driver 17 for SQL Server'也是可以的。
使用DSN
使用了DSN,代码中就不需要指明DRIVER和SERVER地址,因为这些信息已经绑定在DSN中。
如果需要使用DSN,那么就需要先在【ODBC 数据源(64 位)】中添加DSN:
完成DSN创建之后,连接代码相应修改为:
import pyodbc
DSN = 'TEST_DSN'
UID = 'sa'
PWD = '123456'
conn = pyodbc.connect(DSN=DSN, UID=UID, PWD=PWD)
使用DSN需要的参数少了,但是DSN的名称必须正确,否则报错:[ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序。
虽然UID、PWD在DSN中已填写,此处仍然需要传入,否则报错:登录失败。
使用SQLAlchemy(提供DNS)
create_engine()需要提供DSN名称:
from sqlalchemy import create_engine, text
engine = create_engine("mssql+pyodbc://sa:123456@TEST_DSN")
with engine.connect() as conn:
result = conn.execute(text("SELECT TOP 10 * FROM ICSTOCKBILL"))
for i in result:
print(i)
方言指定为mssql+pyodbc,需要安装pyodbc,但是不需要import pyodbc,因为sqlalchemy会自动加载所需依赖。
使用SQLAlchemy(不提供DNS)
不提供DNS时,URL中需指定驱动程序名称。格式如下:
mssql+pyodbc://sa:123456@127.0.0.1:1433/AIS1624?driver=ODBC+Driver+17+for+SQL+Server
端口默认1433,可以不提供。
此处指定驱动程序为ODBC Driver 17 for SQL Server,需确保环境中已安装该版本程序,或者填写为已安装的版本,名称中的空格用+占位。