Python调用MySQL时WITH AS语法报1064错误,求修正方案
修正MySQL CTE(WITH AS)在Python中的语法错误
问题背景
我的表test_table结构如下:
| id | name |
|---|---|
| 1 | aa |
| 2 | bb |
| 3 | cc |
使用Python调用MySQL时,执行带WITH AS的SQL语句报错:
mysql.connector.errors.ProgrammingError: 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'test as(SELECT * from test_table) SELECT name FROM test' at line 1
出错的Python代码:
cnxn = mysql.connector.connect(**sql_config) cursor = cnxn.cursor() query = """ with test as(SELECT * FROM `test_table`) SELECT * FROM test """ cursor.execute(query) get_data = cursor.fetchall() cnxn.close() cursor.close()
已知两种正常场景:
- 在Sequel Ace中执行以下SQL可正常运行:
with `test` as ( SELECT * FROM `test_table`) SELECT `name` FROM `test`
- Python中执行不带WITH AS的查询无问题:
query = """ SELECT name FROM test_table """
修正方案
问题根源是SQL语句的语法格式问题,结合MySQL的CTE规则,做以下调整:
规范CTE语法格式
MySQL要求WITH子句和后续的主查询之间要紧密衔接,同时建议给CTE名称加上反引号避免冲突,修正后的查询语句:query = """ WITH `test` AS (SELECT * FROM `test_table`) SELECT * FROM `test` """也可以使用紧凑写法,避免缩进带来的空格干扰:
query = "WITH `test` AS (SELECT * FROM `test_table`) SELECT * FROM `test`"检查MySQL版本兼容性
注意:MySQL 8.0及以上版本才支持WITH AS(CTE)语法,如果你的MySQL版本低于8.0,必须改用子查询替代:query = "SELECT * FROM (SELECT * FROM `test_table`) AS `test`"
内容的提问来源于stack exchange,提问作者cocoa cocoa
相关产品推荐
相关产品推荐

