使用SQLAlchemy+PyMSSQL无法在连接串传递属性的问题
解决pymssql连接SQLAlchemy时传递MultiSubnetFailover属性的问题
这个问题的核心在于pymssql和pyodbc的连接参数处理逻辑完全不同:pyodbc基于ODBC驱动,支持通过连接字符串附加?key=value格式的参数;但pymssql是直接基于TDS协议实现的,不支持这种ODBC风格的参数传递方式,这也是你报错的根本原因。
正确的参数传递方式:使用connect_args
SQLAlchemy允许通过create_engine的connect_args参数,直接向底层的pymssql连接函数传递它支持的参数。对于MultiSubnetFailover,pymssql对应的参数名是小写加下划线的multi_subnet_failover,你可以这样写:
from sqlalchemy import create_engine engine = create_engine( 'mssql+pymssql://username:password@127.0.0.1/databaseName', connect_args={"multi_subnet_failover": True} )
为什么之前的写法会报错?
你之前尝试在连接字符串后附加?driver=ODBC+Driver+17+for+sql+server,SQLAlchemy会把这个部分解析成关键字参数,传递给pymssql的connect()函数。但pymssql的connect()根本不接受MultiSubnetFailover(驼峰式)这个参数,它只认multi_subnet_failover;而且pymssql本身不需要指定ODBC驱动(它不是基于ODBC实现的),所以就抛出了TypeError: connect() got an unexpected keyword argument 'MultiSubnetFailover'的错误。
补充说明
- pymssql支持的连接参数可以参考它的官方文档,所有需要传递的特殊参数都应该通过
connect_args传入,而不是附加在连接字符串后面。 - 如果你需要指定其他TDS相关的参数(比如TDS版本),也可以通过
connect_args传递,比如connect_args={"tds_version": "7.4"}。
内容的提问来源于stack exchange,提问作者Chaitanya
相关产品推荐
相关产品推荐

