Flask应用连接MySQL遇caching_sha2_password加载失败问题求助
解决Flask连接MySQL时的caching_sha2_password认证错误
嘿,我之前也踩过这个一模一样的坑!这个错误核心是MySQL 8.0及以上版本默认启用了caching_sha2_password认证插件,但你用的Python数据库驱动(比如MySQLdb)对这个插件的支持不完善,哪怕你修改了用户的认证方式,可能还有几个细节没处理到位,我给你一步步梳理排查方案:
1. 确认用户认证方式修改是否真正生效
首先得确保你执行的ALTER USER语句确实起作用了:
- 登录MySQL命令行,执行以下查询:
SELECT user, host, plugin FROM mysql.user WHERE user='root'; - 检查输出中
root@localhost对应的plugin字段是否为mysql_native_password - 如果还是
caching_sha2_password,说明修改没生效,需要执行:
之后重启MySQL服务,再重新查询确认FLUSH PRIVILEGES;
2. 替换兼容的数据库驱动
MySQLdb对MySQL 8.0的兼容性很差,建议换成pymysql驱动,它完美支持mysql_native_password:
- 先安装/升级pymysql:
pip install --upgrade pymysql - 在你的Flask应用入口文件开头添加以下代码,让pymysql替代MySQLdb工作:
import pymysql pymysql.install_as_MySQLdb()
3. 检查并修正数据库连接配置
不管你用flask_mysql还是flask_sqlalchemy,确保连接字符串正确:
- 对于Flask-SQLAlchemy,配置应该类似:
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:root@localhost/你的数据库名' # 或者显式指定pymysql驱动: # app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:root@localhost/你的数据库名' - 对于Flask-MySQL,配置示例:
app.config['MYSQL_DATABASE_USER'] = 'root' app.config['MYSQL_DATABASE_PASSWORD'] = 'root' app.config['MYSQL_DATABASE_DB'] = '你的数据库名' app.config['MYSQL_DATABASE_HOST'] = 'localhost'
4. 重启相关服务
- 确保MySQL服务已经重启,让用户认证方式的修改彻底生效
- 重启你的Flask应用,确保新的驱动配置和连接参数被加载
完整测试示例(Flask-SQLAlchemy)
这里给你一个可以直接运行的测试代码,验证连接是否正常:
from flask import Flask from flask_sqlalchemy import SQLAlchemy import pymysql # 替换MySQLdb为pymysql pymysql.install_as_MySQLdb() app = Flask(__name__) # 替换成你的数据库信息 app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:root@localhost/test_db' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False db = SQLAlchemy(app) # 测试数据库连接的路由 @app.route('/') def check_db_connection(): try: # 执行简单查询测试连接 db.session.execute('SELECT 1') return "✅ 数据库连接成功!" except Exception as e: return f"❌ 连接失败:{str(e)}" if __name__ == '__main__': app.run(debug=True)
按照这些步骤来,应该就能解决这个认证错误了!
内容的提问来源于stack exchange,提问作者Jay
相关产品推荐
相关产品推荐

