使用PyMySQL连接MySQL遇1045权限错误及授权语法问题求助
解决PyMySQL连接MySQL的权限错误及GRANT语法问题
咱们一步步来解决你遇到的两个问题:PyMySQL的连接权限报错,还有GRANT语句的语法问题。
一、GRANT语句的语法错误原因及修复
你执行grant all privileges on [db_name] to root@localhost identified by "Password";时触发语法错误,核心原因是MySQL 8.0及以上版本已经移除了GRANT语句中附带IDENTIFIED BY的语法——不能再用一条语句同时完成授权和设置密码,必须拆分成两步操作:
先调整root用户的认证方式(确保是PyMySQL支持的密码认证)并设置密码:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的实际密码';注:新版MySQL默认用
caching_sha2_password插件,PyMySQL虽支持但配置稍复杂,改成mysql_native_password更稳妥。再执行授权语句(注意去掉方括号,替换成你真实的数据库名):
GRANT ALL PRIVILEGES ON db_name.* TO 'root'@'localhost';最后刷新权限让设置立即生效:
FLUSH PRIVILEGES;
二、PyMySQL的Access denied for user 'root'@'localhost' (using password: NO)错误解决
这个报错的关键信息是using password: NO——意思是PyMySQL连接时根本没传递密码,但你明明写了password="pass",可能的原因及修复方法:
- 检查密码参数拼写:确认你写的是
password而不是passwd(PyMySQL的参数名是password,别拼写错误);如果密码包含特殊字符(比如双引号、反斜杠),试试用单引号包裹密码,比如password='pass_with_special"'。 - 确认root用户的认证方式:如果刚才没调整认证方式,root@localhost可能用的是
auth_socket插件(MySQL 8.0默认),这种方式通过操作系统用户认证,完全忽略密码输入,自然会出现using password: NO的错误,一定要执行上面的ALTER USER语句改成密码认证。 - 尝试指定Unix Socket路径:如果你的MySQL通过本地socket连接而非TCP/IP,可能需要手动指定socket路径,比如:
pymysql.connect( host='localhost', user='root', password="你的密码", db='db_name', charset='utf8', port=3306, unix_socket='/var/run/mysqld/mysqld.sock' # Mac系统可能是/tmp/mysql.sock,根据你的环境调整 ) - 验证数据库名一致性:确保授权时用的数据库名和PyMySQL连接参数里的
db='db_name'完全一致,不要带方括号或其他多余符号。
按上面的步骤操作,应该就能解决问题了。
内容的提问来源于stack exchange,提问作者dnjs7292
相关产品推荐
相关产品推荐

