尽管已设置密码并在连接 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 访问被拒绝(使用密码:否)的主要内容,如果未能解决你的问题,请参考以下文章