【问题标题】:How to escape quotes in django sql formatting如何在 django sql 格式中转义引号
【发布时间】:2018-11-11 22:56:47
【问题描述】:

我有以下代码:

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

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

【问题讨论】:

  • 你能告诉我ids是什么吗?
  • 你到底想做什么?你想创建一个 ids 元组用作 sql 中的变量
  • 你为什么用逗号加入,然后又去掉逗号?
  • 你为什么将其作为原始 SQL 而不是 ORM 查询,它会处理所有相关的转义?
  • @DanielRoseman 如果您可以向我展示如何将其作为常规 ORM 查询进行操作,我完全赞成 - 请注意,查询中还有一个联合(上面未提及)并应用了两个限制,所以不是一个简单的查询。

标签: python sql django


【解决方案1】:

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

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)

【讨论】:

    猜你喜欢
    • 2022-07-28
    • 2018-12-17
    • 1970-01-01
    • 2018-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    相关资源
    最近更新 更多