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)
只需用适当的值替换条件占位符。
| 归档时间: |
|
| 查看次数: |
3176 次 |
| 最近记录: |