You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,说明修改没生效,需要执行:
    FLUSH PRIVILEGES;
    
    之后重启MySQL服务,再重新查询确认

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 07:05:15