首页 > 解决方案 > 尽管已设置密码并在连接 uri 中输入密码,但用户 root@localhost 的 mysql 访问被拒绝(使用密码:否)

问题描述

我正在尝试在烧瓶应用程序中使用 pymysql 和 Flask-sqlalchemy 配置 mysql 数据库。

db = SQLAlchemy()
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:password@localhost:3306/ftm'
db.init_app(app)

但是,当我运行我的应用程序时,我得到:

OperationalError: (pymysql.err.OperationalError) (1045, u"Access denied for user 'root'@'localhost' (using password: NO)")

我尝试重置密码,并验证它是否有效:从命令行,我可以通过以下方式输入 mysql:

mysql -u root -p

然后在提示符下输入我的密码。有没有人知道为什么 mysql 似乎认为我试图在没有密码的情况下进行连接,即使我在 URI 中有一个(有效的)密码?

请注意,这是与mysql_exceptions.OperationalError: (1045, "Access denied for user 'root'@'localhost' (using password: YES)")和其他潜在重复问题不同的问题,因为这些错误消息至少记录了连接尝试附有密码。

编辑:没有特别的顺序,我有:尝试不同的用户,在 db.init_app 之前检查连接字符串的状态,创建一个不同的 MySQL 实例并尝试连接到它,从连接字符串中删除 pymysql,然后尝试返回用 pdb 跟踪它(没用,因为我识别为我自己的唯一方法调用是 init_app())。我还搜索了互联网,并没有发现有人在尝试使用密码连接到数据库时收到此错误消息。我能想到的唯一剩下的可能性是在从 app.config 传递到 mysql 时(当我调用 db.init_app 时),有些东西正在更改我的字符串以删除密码。有任何想法吗?如果没人有,那我就只能用 Postgre 什么的了……</p>

标签: mysqlflasksqlalchemyflask-sqlalchemypymysql

解决方案


我遇到了这个问题并通过进入 db shell 并告诉 mysql 使用 mysql_native_password 身份验证插件来验证您的数据库来解决它。这是一个较旧的插件,可能值得寻找一个也与 Python 的 mysql 连接驱动程序兼容的新插件,但这是我让它工作的唯一方法。

ALTER USER 'user_name'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password123'

在 op 提供的示例中,您将替换rootuser_name.

有关插件的更多信息:https ://dev.mysql.com/doc/refman/8.0/en/native-pluggable-authentication.html


推荐阅读