mysqlclient+SQLAlchemy连接MySQL报错,单独用驱动可正常连接
关于mysqlclient结合SQLAlchemy连接MySQL的问题
环境配置
- Windows10
- Python 3.10
- mysqlclient 2.1.1
- MySQL Community Server 8.0.31
单独使用mysqlclient驱动连接正常
直接调用_mysql.connect可成功连接并执行查询:
import sqlalchemy from MySQLdb import _mysql dburl = sqlalchemy.engine.URL.create(drivername="mysql+mysqldb", username="xxx", password="xxx", host="localhost", port=33060, database="xxx_db") db = _mysql.connect(dburl.host, dburl.username, dburl.password, dburl.database) db.query('select * from test') print(db.store_result())
执行结果:
<_mysql.result object at 000001CE03780720>
mysqld日志:
2022-10-20T07:09:16.157743Z 50 Connect xxx@localhost on xxx_db using TCP/IP 2022-10-20T07:09:16.159751Z 50 Query select * from test 2022-10-20T07:09:16.833462Z 50 Quit
使用SQLAlchemy连接报错
使用同一个dburl通过SQLAlchemy创建引擎执行查询时出错:
engine = sqlalchemy.create_engine(dburl) engine.execute('select * from test')
错误信息:
sqlalchemy.exc.InterfaceError: (MySQLdb.InterfaceError) (0, '')
mysqld日志:
2022-10-20T07:26:27.991626Z 55 Connect 2022-10-20T07:26:27.991875Z 55 Quit
开启SQLAlchemy调试日志也无法获取更多有效信息:
import logging, sys logging.basicConfig(stream=sys.stdout, level=logging.DEBUG) logging.getLogger('sqlalchemy.engine').setLevel(logging.DEBUG)
次日更新:核心差异与临时补丁
经过运行时追踪,发现两种连接方式的核心差异:
- 单独使用驱动时,通过传入
*args元组初始化认证参数 - SQLAlchemy则通过
**kwargs字典初始化连接
在MySQLdb模块的Connect方法开头添加以下临时补丁后,SQLAlchemy可正常工作(路径:<pythondir>\Lib\site-packages\MySQLdb\__init__.py):
if not len(args): args = tuple([kwargs.pop(k, '') for k in ['host', 'user', 'passwd', 'db']]) kwargs.pop('port', None)
该补丁存在无法自定义port的问题,寻求更合理的解决方案。
内容的提问来源于stack exchange,提问作者McV
相关产品推荐
相关产品推荐

