我试图在一个烧瓶应用程序中使用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或其他东西......
答案 0 :(得分: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
答案 1 :(得分:1)
也许您的“连接”语法没有发送密码(就像您认为的那样)
也许你的“用户”(例如“root”)和“host”(例如“localhost”)的组合在mySQL中没有完全按你想象的那样定义。
也许用户和主机的组合没有像你想象的那样从app.config传递到mysql。
SUGGESTIONS:
看这里:
考虑更改“mysql + pymysql”,看看会发生什么。
考虑定义一个不同的用户(无论如何,“root”可能是一个坏主意),看看会发生什么。
添加“printf's”(或Alchemy等效物)和/或开启追踪。
本教程也可能有所帮助: