我在尝试为Cassandra正确格式化查询字符串时遇到问题。我有我正在参加的这个查询
session.execute("UPDATE query3 SET movietitle = '{:s}' WHERE itemid = {:d} and userid in (1, 2000)".format(cols[1], id))
问题在于movietitle的格式可以为Toy Story (1995)
或Mr. Holland's Opus (1995)
,因此,如果没有引号,则括号会引起查询问题。但是,单引号也会引起问题,因为电影标题的名称中可能带有引号。有没有一种构造此查询的巧妙方法?
答案 0 :(得分:3)
请勿使用Python的内置字符串format
函数在查询字符串中设置值。这将使您的应用程序面临一类称为SQL / CQL注入攻击的错误和安全问题。
相反,DataStax Python驱动程序支持参数化查询。
Session.execute(...)
带有一个parameters
参数,可让您指定要替换的值的序列或 dict 。
例如,您的查询应如下所示:
session.execute("UPDATE query3 SET movietitle = %s WHERE itemid = %s and userid in (1, 2000)", parameters=(cols[1], id))
如果需要多次执行相同的查询,还可以考虑使用prepared statements。这些具有性能优势。