我正在尝试在flask应用程序中使用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\u exceptions.operationalerror:(1045,“拒绝访问用户'root'@'localhost'(使用密码:yes)”)和其他可能的重复问题不同,因为这些错误消息至少表明连接尝试附加了密码。
编辑:没有特别的顺序,我已经:尝试了一个不同的用户,在db.init\u app之前检查了连接字符串的状态,创建了一个不同的mysql示例并尝试连接到它,从连接字符串中删除了pymysql,并尝试用pdb跟踪它(没用,因为我唯一识别为自己的方法调用是init\u app())。我也搜索过互联网,没有发现任何人在试图使用密码连接到数据库时收到此错误消息。我能想到的唯一可能是,当从app.config传递到mysql(当我调用db.init\u app时)时,有东西正在更改我的字符串以删除密码。有什么想法吗?如果没有人的话,我只能用postgre之类的…
2条答案
按热度按时间ma8fv8wu1#
我遇到了这个问题,通过进入db shell并告诉mysql使用mysql\u native\u密码验证插件对数据库进行验证,解决了这个问题。这是一个较旧的插件,可能值得寻找一个与python的mysql connect驱动程序兼容的较新插件,但这是我让它工作的唯一方法。
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
6qqygrtg2#
好的,这里有几个潜在的问题。例如:
可能您的“connect”语法没有发送密码(就像您认为的那样)
也许你的“user”(例如“root”)和“host”(例如“localhost”)的组合在mysql中的定义和你想象的不完全一样。
也许用户和主机的组合并没有像你想象的那样从app.config传递到mysql。
建议:
看这里:
在flask中使用mysql,这里:
mysql\u exceptions.operationalerror:(1045,“拒绝访问用户'root'@'localhost'(使用密码:yes)”)。
考虑更改“mysql+pymysql”,看看会发生什么。
考虑定义一个不同的用户(“root”可能是个坏主意),看看会发生什么。
添加“printf”(或等效的炼金术)和/或打开跟踪。
本教程还可能有助于:
flask mega教程,第十六部分:调试、测试和评测