我有以下代码:
# looks like: "('tt1098327','tt3819668','tt0049251')", <type 'str'>
ids_as_string = "(-1)" if not ids else ("('" + "','".join(ids).strip("',") + "')")
items = list(Item.objects.raw("""SELECT * FROM mturk_imdb WHERE (MATCH(name) against(%s)) AND (imdb_id NOT IN %s)""", (q, ids_as_string )))
此问题是sql格式化程序试图转义为元组添加的引号:
DatabaseError:(1064,“您的SQL语法有错误;请查看与您的MySQL服务器版本相对应的手册,以获取在''(\'tt1098327 \',\'tt3819668 \,附近使用的正确语法, \'tt0049251 \',\'tt3878722 \
做上述事情的正确方法是什么?
答案 0 :(得分:0)
这可能是一种非常愚蠢的方法,但是一种方法是将两种不同类型的字符串格式组合如下:
sql = "SELECT * FROM mturk_imdb WHERE (MATCH(name) against(%s)) AND (imdb_id NOT IN %s) LIMIT 20 UNION SELECT * FROM mturk_imdb WHERE name=%s AND (imdb_id NOT IN %s) LIMIT 30" % ('%s', imdb_ids_as_tuple_str, '%s', imdb_ids_as_tuple_str)
items = list(Item.objects.raw(sql, (q, q)))
在需要确切的未转义字符串的地方,可以使用%
;在要转义用户输入的数据的地方,可以使用, (params)
。