本文介绍 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 注入保护如何工作的更多信息。
相关用法
- Python Django RandomUUID用法及代码示例
- Python Random.Choices()用法及代码示例
- Python Django Radians用法及代码示例
- Python Django RadioSelect用法及代码示例
- Python Django RangeOperators用法及代码示例
- Python PIL RankFilter()用法及代码示例
- Python Django Response.json用法及代码示例
- Python Django Repeat用法及代码示例
- Python Django RelatedManager.set用法及代码示例
- Python RLock acquire()用法及代码示例
- Python Django RelatedManager.remove用法及代码示例
- Python Django RequestContext用法及代码示例
- Python Django Reverse用法及代码示例
- Python Django REQUIRED_FIELDS用法及代码示例
- Python Django Redirect用法及代码示例
- Python Django RelatedManager.clear用法及代码示例
- Python Django Right用法及代码示例
- Python Django RelatedManager.create用法及代码示例
- Python RLock release()用法及代码示例
- Python Django RelatedManager.add用法及代码示例
- Python Django Response.resolver_match用法及代码示例
- Python Django Response.context用法及代码示例
- Python Django RedirectView用法及代码示例
- Python Django Round用法及代码示例
- Python Django RequireDebugFalse用法及代码示例
注:本文由纯净天空筛选整理自djangoproject.com大神的英文原创作品 django.db.models.expressions.RawSQL。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。