pyodbc + SQLAlchemy
使用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(提供DSN)
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(不提供DSN)
不提供DSN时,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,需确保环境中已安装该版本程序,或者填写为已安装的版本,名称中的空格用+占位。