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

Posted

技术标签:

【中文标题】尽管已设置密码并在连接 uri 中输入密码,但用户 root@localhost 的 mysql 访问被拒绝(使用密码:否)【英文标题】:mysql Access denied for user root@localhost (using password: NO) despite having set a password and entered it in connection uri 【发布时间】:2018-10-30 13:52:16 【问题描述】:

我正在尝试在烧瓶应用程序中使用 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 什么的了……

【问题讨论】:

mysql_exceptions.OperationalError: (1045, "Access denied for user 'root'@'localhost' (using password: YES)")的可能重复 您的密码是否包含任何特殊字符(字母和数字除外)? @jdigital 它没有 @paulsm4 已编辑以澄清原因 在 db.init_app 之前,打印出连接字符串并确保您发送的是您认为发送的内容。 mysql 认为您没有发送密码似乎很奇怪。 sqlalchemy 有禁止通过连接字符串输入密码的选项吗? 【参考方案1】:

好的,这里有几个潜在的问题。例如:

    也许您的“连接”语法没有发送密码(就像您认为的那样)

    也许您的“用户”(例如“root”)和“主机”(例如“localhost”)的组合在 mySQL 中的定义与您想象的不完全一样。

    也许用户和主机的组合并没有像您想象的那样从 app.config 传递到 mysql。

建议:

    看这里:

    Using MySQL in Flask 和这里:

    mysql_exceptions.OperationalError: (1045, "Access denied for user 'root'@'localhost' (using password: YES)").

    考虑改变“mysql+pymysql”看看会发生什么。

    考虑定义一个不同的用户(无论如何“root”可能是个坏主意),看看会发生什么。

    添加“printf's”(或 Alchemy 等效项)和/或打开跟踪。

本教程也可能会有所帮助:

The Flask Mega-Tutorial, Part XVI: Debugging, Testing and Profiling

【讨论】:

很好的建议,我已将其缩小到可能性#3(我认为)。关于如何测试的任何想法?【参考方案2】:

我遇到了这个问题,并通过进入 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

【讨论】:

感谢工作。但是你能解释一下那个命令的作用吗? @AnumSheraz 谢谢。我添加了一些注释。【参考方案3】:
mysql -u root -p

用户设置为root 密码为空。

app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:@localhost:3306/ftm'

后面的冒号:是用户和密码的分隔符。如果密码为空,@ 紧跟在: 之后。

【讨论】:

以上是关于尽管已设置密码并在连接 uri 中输入密码,但用户 root@localhost 的 mysql 访问被拒绝(使用密码:否)的主要内容,如果未能解决你的问题,请参考以下文章

远程桌面连接输入用户名和密码以后提示“您的凭据不工作”无法登陆

怎么解决安卓手机无法连接wifi

mysql 用户账号权限与密码问题

局域网内共享不跳出输入密码窗口怎么设置?

在Linux中,MySQL密码没过期,刚重置完,提示已过期

如何设置登录界面,并且需要用户自己输入用户名和密码