📝 问题记录:Windows下Python连接MySQL进程崩溃

问题现象

  • 运行Python脚本,调用mysql-connector-pythonconnect()方法时,程序直接崩溃退出。
  • 控制台输出仅有[Monitor:tool_start] ...,然后出现:
    进程已结束,退出代码为 -1073741819 (0xC0000005)
    
  • 命令行通过docker exec进入容器执行mysql命令可以正常连接,但Python代码无法连接。
  • 尝试修改host127.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)}'

(注意:使用pymysqllocalhost通常也可用,但保留此改动更稳定)

验证结果

修改后,运行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)}'

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐