SQLAlchemy连接MySQL出现重置异常与AttributeError问题求助
AttributeError: 'NoneType' object has no attribute 'pack' on SQLAlchemy MySQL Connection Close
问题重现
我在使用SQLAlchemy连接MySQL时,执行查询、会话操作都能正常完成,但代码运行结束时总会抛出如下异常(即使操作本身没有报错):
Exception during reset or similar Traceback (most recent call last): File "/Users/philipjoss/opt/miniconda3/envs/capra/lib/python3.9/site-packages/sqlalchemy/pool/base.py", line 682, in _finalize_fairy fairy._reset(pool) File "/Users/philipjoss/opt/miniconda3/envs/capra/lib/python3.9/site-packages/sqlalchemy/pool/base.py", line 887, in _reset pool._dialect.do_rollback(self) File "/Users/philipjoss/opt/miniconda3/envs/capra/lib/python3.9/site-packages/sqlalchemy/engine/default.py", line 667, in do_rollback dbapi_connection.rollback() File "/Users/philipjoss/opt/miniconda3/envs/capra/lib/python3.9/site-packages/mysql/connector/connection.py", line 1236, in rollback self._execute_query("ROLLBACK") File "/Users/philipjoss/opt/miniconda3/envs/capra/lib/python3.9/site-packages/mysql/connector/connection.py", line 1248, in _execute_query self.cmd_query(query) File "/Users/philipjoss/opt/miniconda3/envs/capra/lib/python3.9/site-packages/mysql/connector/connection.py", line 828, in cmd_query packet.extend(lc_int(len(self._query_attrs))) File "/Users/philipjoss/opt/miniconda3/envs/capra/lib/python3.9/site-packages/mysql/connector/utils.py", line 164, in lc_int return bytearray(struct.pack('<B', i)) AttributeError: 'NoneType' object has no attribute 'pack'
环境信息:
- Python 3.9.6
- SQLAlchemy 1.4.23(已升级至1.4.25,问题仍存在)
- MySQL 8.0.26
问题分析
这个错误的核心是mysql-connector-python库的utils.py中,struct模块被意外置为None,导致调用struct.pack()时失败。这通常是Connector/Python版本与SQLAlchemy或Python环境的兼容性问题,或者是连接池在重置连接时的异常处理逻辑bug。
解决方案
这里有几个可行的解决思路,按优先级推荐:
升级/降级
mysql-connector-python
这个问题在特定版本的Connector/Python中存在,建议升级到最新稳定版,或者尝试降级到已知兼容的版本(比如8.0.28或8.0.30)。执行以下命令升级:pip install --upgrade mysql-connector-python切换到
pymysql驱动
如果调整Connector/Python版本无效,建议改用pymysql作为数据库驱动——它和SQLAlchemy的兼容性更稳定,这类底层bug出现的概率更低。
首先安装pymysql:pip install pymysql然后修改你的连接字符串,将驱动前缀从
mysql+mysqlconnector://替换为mysql+pymysql://:connection_str = "mysql+pymysql://your_username:your_password@host:port/your_db" engine = sa.create_engine(connection_str)显式控制连接销毁
在代码运行结束时,手动关闭连接并销毁引擎,绕过连接池的自动重置逻辑:# 在代码末尾添加 connection.close() engine.dispose()调整连接池配置
尝试禁用连接池的重置逻辑,在创建引擎时设置pool_reset_on_return=None:engine = sa.create_engine( connection_str, pool_reset_on_return=None )
内容的提问来源于stack exchange,提问作者Jossy
相关产品推荐
相关产品推荐

