【智能体学习】问题记录——Windows下Python连接MySQL进程崩溃
·
📝 问题记录:Windows下Python连接MySQL进程崩溃
问题现象
- 运行Python脚本,调用
mysql-connector-python的connect()方法时,程序直接崩溃退出。 - 控制台输出仅有
[Monitor:tool_start] ...,然后出现:进程已结束,退出代码为 -1073741819 (0xC0000005) - 命令行通过
docker exec进入容器执行mysql命令可以正常连接,但Python代码无法连接。 - 尝试修改
host为127.0.0.1、调整数据库名等均无效。
环境信息
- 操作系统:Windows
- Python版本:3.12
- MySQL驱动:
mysql-connector-python - MySQL服务:运行在Docker容器中,端口映射到宿主机3306
根本原因
mysql-connector-python驱动依赖C扩展,在Windows环境下可能存在不稳定的二进制兼容性问题,导致内存访问冲突(0xC0000005异常)。- 该驱动在某些Windows配置中无法正确通过TCP/IP连接
localhost,而命令行mysql客户端使用的是不同协议栈,所以能正常连接。
解决方案
替换MySQL驱动为纯Python实现的pymysql。
步骤1:安装pymysql
pip install pymysql
步骤2:修改代码中的导入和异常处理
# 原代码
from mysql.connector import connect, Error
# 修改后
import pymysql
from pymysql import Error as PyMySQLError
步骤3:调整连接调用
# 原代码
with connect(**config) as conn:
...
# 修改后
with pymysql.connect(**config) as conn:
...
步骤4:修改异常捕获
# 原代码
except Error as e:
return f'查询表出现异常{str(e)}'
# 修改后
except PyMySQLError as e:
return f'查询表出现异常{str(e)}'
(注意:使用pymysql后localhost通常也可用,但保留此改动更稳定)
验证结果
修改后,运行list_sql_tables()函数可以正常返回数据库中的表名,进程不再崩溃。
经验教训
- 遇到进程崩溃且退出代码为
0xC0000005时,优先怀疑是C扩展库的兼容性问题,尝试替换为纯Python实现的库。 - 在Windows环境下进行数据库开发时,
pymysql是更稳妥的选择。 - 测试数据库连接时,先用简单的独立脚本验证,避免集成到大型项目中排查困难。
相关代码片段(原代码)
from mysql.connector import connect, Error
def list_sql_tables()->str:
"""
查询当前库中所有可用的表
作用:为了模型识别有哪些可用
:return:
"""
monitor.report_tool(tool_name='数据库表查询工具',args={})
config = get_db_config()
# 替换 connect 函数
try:
with connect(**config) as conn:
with conn.cursor() as cursor:
sql = 'SHOW TABLES'
cursor.execute(sql)
tables = cursor.fetchall()
if not tables:
return '没有可用的表'
table_names = [table[0] for table in tables]
return f'可用的表有:{", ".join(table_names)}'
except Error as e:
return f'查询表出现异常{str(e)}'
修改后代码
import pymysql
from pymysql import Error as PyMySQLError
def list_sql_tables()->str:
"""
查询当前库中所有可用的表
作用:为了模型识别有哪些可用
:return:
"""
monitor.report_tool(tool_name='数据库表查询工具',args={})
config = get_db_config()
# 替换 connect 函数
try:
with pymysql.connect(**config) as conn:
with conn.cursor() as cursor:
sql = 'SHOW TABLES'
cursor.execute(sql)
tables = cursor.fetchall()
if not tables:
return '没有可用的表'
table_names = [table[0] for table in tables]
return f'可用的表有:{", ".join(table_names)}'
except PyMySQLError as e:
return f'查询表出现异常{str(e)}'
更多推荐


所有评论(0)