使用Python驱动向Cassandra插入数据报CQL语法错误求助
问题原因
你遇到的语法错误是因为TEXT类型的node_id值在生成的CQL语句中没有被单引号包裹。直接用字符串格式化拼接SQL时,node_id='P2'会被替换成P2,最终生成的插入语句是:
INSERT INTO batch_rows (local_pid, node_id, camera_id, geolocation, filepath) VALUES (0, P2, 1, 4, 3)
Cassandra会把P2识别为列名或其他标识符,而非TEXT类型的字符串值,因此抛出语法错误。
解决方案
方法1:使用参数绑定(推荐,安全且避免类型问题)
Cassandra的Python驱动支持参数绑定,通过占位符让驱动自动处理类型转换和引号包裹,还能避免SQL注入风险:
local_pid = i node_id= 'P2' camera_id= 1 geolocation= 4 filepath = 3 # 用?作为参数占位符,表名仍用格式化替换 query = 'INSERT INTO %s (local_pid, node_id, camera_id, geolocation, filepath) VALUES (?, ?, ?, ?, ?)' % table self.session.execute(query, (local_pid, node_id, camera_id, geolocation, filepath))
方法2:手动为TEXT值添加单引号(不推荐,存在注入风险)
如果一定要用字符串格式化拼接,需给node_id的占位符额外添加单引号:
self.session.execute('INSERT INTO %s (local_pid, node_id, camera_id, geolocation, filepath) VALUES (%s, \'%s\', %s, %s, %s) ' % (table, local_pid, node_id, camera_id, geolocation, filepath))
这种方式能临时解决语法问题,但生产环境不建议使用,容易引发SQL注入。
另外补充:你的建表语句里filepath字段定义为int类型,如果实际要存储的是文件路径字符串,建议改成text类型,避免后续类型不匹配问题。
内容的提问来源于stack exchange,提问作者frankenstein
相关产品推荐
相关产品推荐

