Python使用mysql.connector连接MySQL时无报错却执行停滞
看起来你的代码卡在了建立MySQL连接的那一步——毕竟你只看到了k,后面的g根本没输出,而且没有任何报错提示,这种情况多半是连接环节出了问题,要么是MySQL服务器没正常跑,要么是连接参数/认证方式不兼容导致连接阻塞了。
我给你梳理几个排查和解决的方向:
先确认MySQL本地服务是否在运行
你先检查下本地的MySQL服务器是不是真的启动了:Windows可以去「服务」列表里找MySQL服务看状态;Linux/macOS可以在终端敲systemctl status mysql(或者mysql.server status)确认。如果服务没开,先启动它再试代码。检查MySQL用户认证方式(针对MySQL 8.0+版本)
MySQL 8.0及以上版本默认用caching_sha2_password作为认证插件,而mysql.connector在某些环境下和这个插件的兼容性不太好,会导致连接卡住没反应。你可以把root用户的认证方式改成老的mysql_native_password试试:- 打开终端登录MySQL命令行:
mysql -u root -p,然后输入你的密码manager - 执行修改命令:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'manager'; - 刷新权限:
FLUSH PRIVILEGES;
改完之后再运行你的Python代码,大概率能解决连接卡住的问题。
- 打开终端登录MySQL命令行:
给连接环节加上超时和异常捕获,明确问题
你现在的代码在连接数据库时没有任何异常处理,所以卡住了也不知道具体原因。可以给connect方法加上超时参数,同时把连接代码包在try-except里,这样能直接看到连接时的错误:def appen(): print('k') try: mysq = mysql.connector.connect(user='root', passwd='manager', host='localhost', database='krishna', connect_timeout=10) print('g') except Exception as e: print(f"连接数据库出错了: {e}") return # 后面的代码保持不变...这样如果连接超时或者有其他错误,会直接打印出来,你就能精准定位问题了。
顺便提个代码优化点:别用f-string拼SQL语句
你现在用f-string拼接insert语句,不仅有SQL注入的风险,要是输入的内容里有单引号(比如名字叫O'Neil),直接就会导致SQL语法错误。换成参数化查询更安全也更稳定:cur.execute( "insert into employee values(%s, %s, %s, %s, %s, %s, %s, %s);", (eno, enm, job, mgr, hd, sal, cm, dn) )这样mysql.connector会自动处理字符串的引号和转义,不用你手动加单引号啦。
备注:内容来源于stack exchange,提问作者krishi

