Python操作Cassandra传参执行Delete查询报CQL语法错误如何解决?
错误原因
- Cassandra CQL的参数绑定仅支持值类参数的转义,不支持绑定列名、表名这类标识符。将列名通过参数字典传递时,驱动会自动为列名添加单引号转为字符串格式,最终生成的CQL语句会变成
delete 'book_info' from books where book_id=?的非法形式,和报错信息中“期望FROM关键字但遇到字符串”的提示完全匹配。 - 代码存在额外隐患:你已将输入的id转为整数
idnum,但实际传参时仍使用了字符串类型的原始输入id,后续可能触发类型不匹配错误。
修复方案
列名不能通过参数绑定传递,需要先做白名单校验(防止注入风险)后直接拼接进CQL语句,过滤条件的id值继续使用参数绑定即可,修复后的代码参考:
if user_input == "b": id = input("Enter id of your book") idnum = int(id) column_name = input("Enter column name") # 配置白名单校验列名合法性,替换为你的books表实际存在的列名 valid_columns = {"book_info", "book_name", "price", "store_count"} if column_name not in valid_columns: print("输入的列名不存在") exit() # 列名直接拼接,加反引号适配含特殊字符的列名场景 delete_cql = f"DELETE `{column_name}` FROM books WHERE book_id = %s" # 传参使用转换后的整数idnum session.execute(delete_cql, (idnum,))
内容的提问来源于stack exchange,提问作者shiva ashrith
相关产品推荐
相关产品推荐

