【问题标题】:Django: RawQuerySet problem with passing multiple paramsDjango:传递多个参数的 RawQuerySet 问题
【发布时间】:2011-05-24 00:52:06
【问题描述】:

我用过这个问题的答案:

Django: making raw SQL query, passing multiple/repeated params?

但有一些问题。

我有参数:

params = {'film_id_string': 'core_film.parent_id', 'tags_params': 'comedy', 'order_by': 'core_film.title', 'content_type': '18', 'language_code': 'en'}

对于 SQL 查询:

query = 'SELECT DISTINCT "core_object".*, "core_film".*  FROM "core_film"  INNER JOIN "core_object" ON ("core_film"."parent_id" = "core_object"."id")  LEFT OUTER JOIN "core_objectlocalized" ON ("core_objectlocalized"."parent_id" = %(film_id_string)s) LEFT OUTER JOIN "tagging_taggeditem" ON ("tagging_taggeditem"."object_id" = "core_objectlocalized"."id") LEFT OUTER JOIN "tagging_tag" ON ("tagging_tag"."id" = "tagging_taggeditem"."tag_id")  WHERE  "tagging_tag"."name" IN (%(tags_params)s) AND "core_objectlocalized"."LANG"=%(language_code)s AND content_type_id=%(content_type)s ORDER BY %(order_by)s'

当我尝试使用 RawQuerySet 时

films = Film.objects.raw(query, params)

我明白了:

SELECT DISTINCT "core_object".*, "core_film".*
FROM "core_film"
INNER JOIN "core_object" ON ("core_film"."parent_id" = "core_object"."id")
LEFT OUTER JOIN "core_objectlocalized" ON ("core_objectlocalized"."parent_id" = E\'core_film.parent_id\')
LEFT OUTER JOIN "tagging_taggeditem" ON ("tagging_taggeditem"."object_id" = "core_objectlocalized"."id")
LEFT OUTER JOIN "tagging_tag" ON ("tagging_tag"."id" = "tagging_taggeditem"."tag_id")
WHERE "tagging_tag"."name" IN (E\'comedy\')
  AND "core_objectlocalized"."LANG"=E\'en\'
  AND content_type_id=E\'18\'
ORDER BY E\'core_film.title\'

问题是,每个带有'E\' 的地方都会产生类似这样的错误:

DatabaseError: invalid input syntax for integer: "core_film.parent_id"
LINE 1: ...calized" ON ("core_objectlocalized"."parent_id" = E'core_fil...

我该如何解决这个问题?

Django 版本 1.2.3。

编辑
我无法删除引号,因为我使用的是字符串:

result = self.function(result, tag, "core_film.parent_id")
def function(self, objects, tags, film_id_string):

我的 RawQuerySet 参数如下所示:

params = {'film_id_string': film_id_string}

当我尝试解析这个时,我得到:

LEFT OUTER JOIN "core_objectlocalized" ON ("core_objectlocalized"."parent_id" = E\'core_film.parent_id\') 

然后我遇到了问题

DatabaseError: invalid input syntax for integer: "core_film.parent_id"
LINE 1: ...calized" ON ("core_objectlocalized"."parent_id" = E'core_fil...

但是,当我使用字符串格式时

LEFT OUTER JOIN "core_objectlocalized" ON ("core_objectlocalized"."parent_id" = %s)' % film_id_string

有效:

LEFT OUTER JOIN "core_objectlocalized" ON ("core_objectlocalized"."parent_id" = core_film.parent_id)

我想省略 SQL 注入的可能性,所以基于 Django docs 我不想传递带有字符串格式的参数。
我还能做什么?

【问题讨论】:

  • 尝试从字典中的值中删除单引号。旧帖子中的情况,似乎是它试图逃避它们的数据库,这就是导致 E\...\.
  • @solartic,感谢您的建议。我已经部分删除了引号,但问题仍然存在。我还在我的问题中添加了额外的信息。
  • @dasm 老实说,额外的信息让我感到困惑,但无论如何我的错误是说“core_objectlocalized”需要一个整数值。“parent_id”,你传递一个字符串?在您的最后一个代码块中,您将其用作变量,而不是我猜对您有用的刺痛。
  • @solartic 这个函数必须从不同的表中捕获变量。我无法设置永久表,因为有时它是“core_film.parent_id”,但有时它是“core_rating.film_id”或“core_filmranking.film_id”。每个值都是整数,但我只想传递字符串,它是 db 中正确整数的地址。
  • @dasm Django 通过转义参数来防止 SQL 插入。这是一条 SQL 语句,因此它不起作用的事实是好的 - Django 正在做它的工作。除非用户将设置“film_id_string”的值,否则您为使其正常工作所做的工作应该没问题。如果不是,那么您仍必须使用 "...%s)' % film_id_string..." 方法,但创建您自己的自定义过滤器以验证它是正确的允许值之一。

标签: django postgresql


【解决方案1】:

Django 通过转义参数来防止 SQL 插入。这是一条 SQL 语句,因此它不起作用的事实是一件好事 - Django 正在做它的工作。除非系统用户将设置“film_id_string”的值,否则您为使其正常工作所做的工作应该没问题。如果不是,那么您仍必须使用“...%s)' % film_id_string...”方法,但创建您自己的自定义过滤器以验证它是否是正确的允许值之一。

【讨论】:

    猜你喜欢
    • 2021-09-12
    • 2021-03-27
    • 1970-01-01
    • 2011-01-20
    • 2018-03-21
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多