将包含字符串的参数传递给 Django Raw sql 的正确方法

bac*_*i32 3 python mysql sql django django-models

我有一堆复杂的 sql 查询需要在 Django 上执行,而原始 SQL 似乎是唯一的选择。我的参数是字符串,可以为空。为空的原因是我上面有条件语句,并且需要执行正确的sql。但是当运行 ra sql 时,django 实际上在 sql 中放置了引号(我用来表示字符串),因此它会引发错误。

我简化了查询以显示我面临的问题。以下查询在执行时会引发错误。

select_cond = ''
where_cond = 'id = 109'

qraw = Book.objects.raw(
        "\
        SELECT  id %s\
        FROM book\
        WHERE %s\
        ",
        [select_cond, where_cond]
)
Run Code Online (Sandbox Code Playgroud)

错误是由于它被翻译如下。引号实际上是在 sql 中,因此它不会执行。关于如何解决这个问题的任何想法?

 SELECT  id ''
 FROM book
 WHERE 'id = 109'
 ORDER BY id DESC;
Run Code Online (Sandbox Code Playgroud)

小智 5

Django为 raw提供了一个'params' 参数,以避免潜在的 SQL 注入攻击。正如@alecxe 的示例所示,python 中的三重引号是定义多行变量并避免任何反斜杠行转义的好方法。这是一个建议的安全解决方案“Django 方式”:

select_cond = condition
where_cond = condition

qraw = Book.objects.raw("""
    SELECT
        id, %(select_cond)s
    FROM
        book
    WHERE
        %(where_cond)s
    """, params={'select_cond': select_cond, 'where_cond': where_cond})
Run Code Online (Sandbox Code Playgroud)

只需用适当的值替换条件占位符。