mysql - 尽管已设置密码并在连接 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>
解决方案
我遇到了这个问题并通过进入 db shell 并告诉 mysql 使用 mysql_native_password 身份验证插件来验证您的数据库来解决它。这是一个较旧的插件,可能值得寻找一个也与 Python 的 mysql 连接驱动程序兼容的新插件,但这是我让它工作的唯一方法。
ALTER USER 'user_name'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password123'
在 op 提供的示例中,您将替换root
为user_name
.
有关插件的更多信息:https ://dev.mysql.com/doc/refman/8.0/en/native-pluggable-authentication.html
推荐阅读
- json - 如何加快大表上的postgres查询
- pyspark - 按列分组后填充缺失值
- angular - 当我将鼠标悬停在选项上时,如何显示和修改工具提示的样式
- php - 如何在 PHP 中使用 Bootstrap Grid
- python - 查找numpy数组中两个值之间的差异
- node.js - 如何为 Nodejs https 客户端使用 usb 令牌 pkcs#11 证书?
- php - 使用存储库时在 null 上调用成员函数 createQueryBuilder()
- css - 即使使用正确的媒体查询,菜单栏也没有响应
- python - 从 pandas 数据框中匹配和提取值
- c# - 在对象/类属性之间共享变量