当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python Django RawSQL用法及代码示例


本文介绍 django.db.models.expressions.RawSQL 的用法。

声明

class RawSQL(sql, params, output_field=None)

有时数据库表达式无法轻松表达复杂的WHERE 子句。在这些边情况下,请使用 RawSQL 表达式。例如:

>>> from django.db.models.expressions import RawSQL
>>> queryset.annotate(val=RawSQL("select col from sometable where othercol = %s", (param,)))

这些额外的查找可能无法移植到不同的数据库引擎(因为您正在显式编写 SQL 代码)并且违反 DRY 原则,因此您应该尽可能避免它们。

RawSQL 表达式也可以用作__in 过滤器的目标:

>>> queryset.filter(id__in=RawSQL("select id from sometable where col = %s", (param,)))

警告

为了防止 SQL injection attacks ,您必须转义用户可以使用 params 控制的任何参数。 params 是强制您承认您没有使用用户提供的数据插入 SQL 的必需参数。

您也不能在 SQL 字符串中引用占位符。由于 %s 周围的引号,此示例易受 SQL 注入攻击:

RawSQL("select col from sometable where othercol = '%s'")  # unsafe!

您可以阅读有关 Django 的 SQL 注入保护如何工作的更多信息。

相关用法


注:本文由纯净天空筛选整理自djangoproject.com大神的英文原创作品 django.db.models.expressions.RawSQL。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。