首页 > 解决方案 > 如何在 django sql 格式中转义引号

问题描述

我有以下代码:

# 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\

执行上述操作的正确方法是什么?

标签: pythonsqldjango

解决方案


这可能是一种非常愚蠢的方法,但一种方法是组合两种不同类型的字符串格式,如下所示:

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).


推荐阅读