Python执行GRANT语句触发pymysql.err.ProgrammingError(1064) SQL语法错误求助
Hey there! Let's break down why you're hitting this ProgrammingError in pymysql even though the same query works smoothly in MySQL Workbench. Here are the most common fixes to try out:
1. 检查pymysql连接用户的权限
你通过pymysql连接数据库的用户可能没有GRANT OPTION权限——这是执行GRANT语句的必要权限。
- 先在MySQL Workbench里用超级用户(比如root)登录,执行以下语句检查你的pymysql用户权限:
SHOW GRANTS FOR '你的pymysql用户名'@'localhost'; -- 替换成实际的用户名和主机 - 如果结果里没有包含
GRANT OPTION的行,就给该用户赋权:GRANT GRANT OPTION ON *.* TO '你的pymysql用户名'@'localhost'; FLUSH PRIVILEGES;
之后再试试运行Python代码。
2. 确保SQL语句完整(MySQL 8.0+尤其注意)
MySQL 8.0及以后的版本修改了用户管理规则:不能再直接用GRANT语句创建用户。如果test-user还不存在,你需要先创建用户,再赋权:
# 先创建用户(如果不存在的话) cursor.execute("CREATE USER IF NOT EXISTS `test-user`@'localhost' IDENTIFIED BY '你的密码';") # 再执行权限授予 cursor.execute("GRANT ALL PRIVILEGES ON `test-db`.* TO `test-user`@'localhost';") # 别忘了刷新权限 cursor.execute("FLUSH PRIVILEGES;")
哪怕你觉得用户已经存在,加上IF NOT EXISTS也能避免报错。另外要注意,CREATE USER和GRANT语句里都要带上主机(比如@'localhost')——漏掉这个也可能导致语法或权限问题。
3. 别忘了开启自动提交(针对事务型引擎)
默认情况下pymysql是关闭自动提交的。如果你用的是InnoDB这类事务型存储引擎,GRANT的修改要等到事务提交才会生效。可以在执行语句后加上:
connection.commit()
或者在创建连接时直接开启自动提交:
connection = pymysql.connect( host='localhost', user='你的用户名', password='你的密码', autocommit=True )
4. 仔细检查Python里的SQL字符串格式
确保你没有在Python代码里不小心破坏了SQL语句的结构:
- 避免错误混用引号类型。如果用单引号包裹Python字符串,
test-db和test-user周围的反引号应该能正常工作:sql = "GRANT ALL PRIVILEGES ON `test-db`.* TO `test-user`@'localhost'" - 如果你用了字符串格式化(比如f-string),要确保没有引入意外字符。注意:永远不要用字符串格式化处理用户输入(要用参数化查询替代),但对于静态名称来说,只要仔细点就没问题。
5. 确认Workbench和pymysql连接的MySQL版本一致
有可能Workbench连接的MySQL服务器版本和Python代码连接的不一样。分别在Workbench和Python里执行以下语句检查版本:
- Workbench里:
SELECT VERSION(); - Python里:
cursor.execute("SELECT VERSION();") print(cursor.fetchone())
如果版本不同,要调整SQL语法适配pymysql连接的服务器版本——比如MySQL 5.7允许用GRANT创建用户,但8.0不支持。
内容的提问来源于stack exchange,提问作者smali

