如何在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
相关产品推荐
相关产品推荐

