Python驱动操作Cassandra预编译语句更新Set字段时遇参数绑定错误
解决Cassandra预编译语句更新Set字段时的参数绑定错误
这个问题我之前处理过,本质是你误解了Cassandra预编译语句中集合类型的占位符用法——你写的{'?'}并不是参数占位符,而是一个包含字符串?的Set字面量,所以数据库只会识别到WHERE子句里的两个?,但你绑定了3个参数,自然就报参数数量不匹配的错误了。
正确的写法思路
Cassandra的预编译语句对集合类型的参数,只需要用单个?占位,然后在绑定参数时直接传入对应的Python集合(比如set类型)即可,不需要在CQL语句里写集合的字面量语法。
修正后的代码示例
# 正确的预编译语句:集合字段用单个?占位 ps = session.prepare(""" UPDATE test.tbl SET val = val + ? where name = ? and id = ?;""") # 绑定参数时,第一个参数是要添加的元素组成的set bs = bind(ps, [{'name'}, 'name', 1]) session.execute(bs)
如果需要一次性添加多个元素到Set字段,直接传入包含多个元素的set就行:
bs = bind(ps, [{'name', 'email', 'phone'}, 'name', 1]) session.execute(bs)
为什么原来的写法不对?
你原来的语句SET val = val + {'?'}里,{'?'}是CQL的字面量语法,表示一个只包含字符串"?"的Set,而非参数占位符。数据库解析这条语句时,只会把后面name = ?和id = ?里的两个?当成需要绑定的参数,所以当你传入3个参数时,就会触发Too many arguments provided的错误。
内容的提问来源于stack exchange,提问作者ghanad
相关产品推荐
相关产品推荐

