當前位置: 首頁>>編程示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。