Python3操作QuestDB插入含单引号字符串报')' expected错误
问题根因
报错和字符串内单引号转义逻辑无关,核心错误是表名的引号使用不符合QuestDB语法规范:
- 单引号在QuestDB SQL中是字符串字面量的专属界定符,仅能用于包裹字符串值,不能用来包裹表名、列名这类标识符
- 表名、列名等标识符如果没有特殊字符、不属于SQL保留字,不需要加任何引号直接书写即可;如果必须转义,只能使用双引号包裹
两个测试场景都错误地用单引号包裹了表名,导致SQL解析器语法栈错位:解析器读到单引号包裹的表名时,会将其识别为字符串值,和INSERT语句的预期语法结构不匹配,后续解析到VALUES子句里的转义单引号时直接抛出')' expected的误导性报错。
补充说明:QuestDB本身的字符串单引号转义规则是用两个连续单引号表示字符串内的一个单引号,psycopg2参数化查询自动生成'o''brian'的转义逻辑是完全正确的。
正确实现方案
Web控制台SQL写法
表名无特殊字符时直接书写,无需加引号:
INSERT INTO cpe_list (mystring) VALUES ('o''brian');
如果表名包含特殊字符、是SQL保留字必须转义,用双引号包裹表名:
INSERT INTO "cpe_list" (mystring) VALUES ('o''brian');
Python psycopg2驱动写法
只需要修正INSERT语句里的表名引号写法,保留原有的参数化传值逻辑即可,不需要手动处理字符串内的单引号:
import psycopg2 connection = psycopg2.connect(user='someuser', password='somepw', host='127.0.0.1', port=8812, database='mydb') cursor = connection.cursor() cursor.execute("CREATE TABLE IF NOT EXISTS mytable (mystring STRING)") # 表名无特殊字符时直接书写,不加引号 sql_query = "INSERT INTO mytable (mystring) VALUES (%s);" # 表名需要转义时使用双引号包裹,写法参考: # sql_query = 'INSERT INTO "mytable" (mystring) VALUES (%s);' cursor.execute(sql_query, ("o'brian",)) # 注意QuestDB的PG协议接口需要显式提交事务 connection.commit() cursor.close() connection.close()
注意:不要手动拼接SQL字符串处理单引号转义,全程使用psycopg2的参数化传值能力,既可以避免语法错误,也能防范SQL注入风险。
内容的提问来源于stack exchange,提问作者Ditto
相关产品推荐
相关产品推荐

