python - 如何在 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\
执行上述操作的正确方法是什么?
解决方案
这可能是一种非常愚蠢的方法,但一种方法是组合两种不同类型的字符串格式,如下所示:
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)
.
推荐阅读
- sql - INSERT 语句与 FOREIGN KEY 约束问题冲突
- github - 如何使用 cli 在 openshift 中更改 github webhook 密码
- algorithm - 从许多 3D 平面中找到 AABB - 形成一个凸包
- android - 在 Android Webview (Crosswalk) 中使用后退按钮
- angularjs - 如何使用条件表达式为 ng-init 赋值?
- python - 如何使用python格式化表中的列数据?
- angular - 将路由注入路由器出口会引发“布尔表达式不得为空”错误
- css - Add and remove (toggle) collapse class for bootstrap tabs
- php - 服务器端渲染上的 PHP 和 React
- ios - 计算scrollView中的精确缩放