我在Django代码中使用了html的输出,如果它为null,我希望mysql查询忽略where子句,并且如果它有值,请在查询中使用。
以下是我的html:
<form method="post" novalidate>
{% csrf_token %}
<input type="text" name="param1" placeholder="param1">
<input type="text" name="param2" placeholder="param">
<input type="text" name="param3" placeholder="param3">
<input type="submit" name="fetchdata" value="Fetch Data">
<br>
</form>
在MySQL中如何实现:
def current_cfg(request):
if request.POST.get("fetchdata"):
param1=request.POST["param1"]
param2=request.POST["param2"] <----aaaa from html as input
param3=request.POST["param3"]
else:
RNC='RRRNCH02'
MO='CORRMALGOSWITCH'
parameterid='DRASWITCH_DRA_VOICE_SAVE_CE_SWITCH'
conn=db.connect(host='localhost', user='update_db', passwd='1qaz!QAZ', db='rnc_parameters')c=conn.cursor()
c=conn.cursor()
c.execute("""select * from rnc_parameters.current_para where (if param1 is null ignore it else param1='aaaaa')""")
current_stats=c.fetchall()
conn.close()
current_stats=list(current_stats)
return render(request,'current.html',{'current_stats':current_stats, 'MO':MO})
您能帮助我正确定义以下部分吗?
c.execute("""select * from rnc_parameters.current_para where (if param1 is null ignore it else param1='aaaaa')""")
答案 0 :(得分:1)
根据评论,我认为变量param2
本身可以是None
,在这种情况下,您不想对此进行过滤。
我们可以通过以下查询来做到这一点:
SELECT *
FROM rnc_parameters.current_para
WHERE (%s IS NULL OR param1='%s')
因此,我们将值重复两次,并且如果参数为NULL
,则条件的第一部分始终为TRUE
,因此不应用任何过滤。如果参数为 not NULL
,则第一部分为FALSE
,因此条件取决于param1
的值。
我们可以将它们链接在一起,例如:
SELECT *
FROM rnc_parameters.current_para
WHERE (%s IS NULL OR param1='%s')
AND (%s IS NULL OR param2='%s')
AND (%s IS NULL OR param3='%s')
带有参数[param1, param1, param2, param2, param3, param3]
。
另一种方法是动态构造查询。例如:
cond = []
vars = []
if param1 is not None:
cond.append("param1 = '%s'")
vars.append(param1)
if param2 is not None:
cond.append("param2 = '%s'")
vars.append(param1)
if param3 is not None:
cond.append("param3 = '%s'")
vars.append(param1)
query = """SELECT * FROM rnc_parameters.current_para"""
if cond:
query += " WHERE " + " AND ".join(cond)
,然后使用vars
作为参数调用查询。
尽管如此,这两种方法都不雅致,我建议使用ORM。
答案 1 :(得分:0)
我认为你的意思是
WHERE (param1 is null OR param1='aaaaa')