You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django Raw SQL中用单个变量绑定多个过滤条件

如何在Django原生SQL中用单个变量绑定多个过滤条件

需求说明

在SQL的WHERE子句中,需要让CUR_DATE、ACHIEVED_DATE两个条件同时匹配同一个date变量的值,避免重复传参降低代码可扩展性。

最优实现方案

方案1:使用命名参数绑定(全数据库兼容,首选方案)

Django的cursor.execute原生支持字典类型的参数传递,SQL中使用%(参数名)s作为占位符,同一个参数名可重复出现,仅需在字典中传一次值即可。

# import 统一放在文件顶部,不要放在函数内部
import time

def kpiMonitoring(self):
    date = time.strftime('%Y%m%d')
    with connections['db'].cursor() as cursor:
        cursor.execute("""        
        SELECT *  FROM TABLE1
        WHERE CUR_DATE = %(target_date)s
              AND ACHIEVED_DATE = %(target_date)s
        """, {"target_date": date})
        row = dictfetchall(cursor)
    # with上下文会自动关闭游标,无需手动调用cursor.close()
    return row

该方案的优势:

  • 变量仅需传递一次,后续新增需要用到该日期的过滤条件时,直接在SQL中新增%(target_date)s占位符即可,不需要修改参数列表,扩展性强
  • 命名占位符语义明确,代码可读性更高

方案2:SQL层面预定义会话变量(适配支持会话变量的数据库)

如果使用MySQL等支持会话变量的数据库,可先给变量赋值后再执行查询,适合单个变量需要在多段SQL中复用的场景:

import time

def kpiMonitoring(self):
    date = time.strftime('%Y%m%d')
    with connections['db'].cursor() as cursor:
        # 预先定义会话变量
        cursor.execute("SET @target_date = %s", [date])
        # 后续查询直接调用变量即可,无需重复传参
        cursor.execute("""        
        SELECT *  FROM TABLE1
        WHERE CUR_DATE = @target_date
              AND ACHIEVED_DATE = @target_date
        """)
        row = dictfetchall(cursor)
    return row

内容的提问来源于stack exchange,提问作者HudsonBarroso

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 20:48:03