做項目時,遇到一場景,前端至少傳入一個參數,最多傳入四個參數,根據單參數或者組合參數,從數據庫篩選數據。
作為一個小白,思考之,從數學的角度,\(C_4^1 + C_4^2+C_4^3+C_4^4=15\),靠,寫SQL要寫15種?
放棄,試圖尋找簡便方法,尋之半天,未果。
默默接受了尋找捷徑所損耗的時間還不如直接用原始的方法,老老實實,一個一個一個一個(還有11個一個)的寫。
可寫的時候內心始終在掙扎,寫到一半時,r忍不住,找大神問了問。
大神曰:“傻不傻逼?為啥要傳參!!!傳參傳死人。構造形式拼接啊,前端接入的參數,用字典接收,然后,將參數字典轉換為字符串,在拼接到SQL語句后,構成SQL語句。”
醍醐灌頂,有沒有?
下面記錄原過程以及新代碼如下,如有相似情境,可借鑒。
原代碼結構
(代碼過多,只看結構,PS:還沒寫完的條件。。)
經大神指點后的代碼:
def user_list_post(username=None, phone=None, dispost_status=None, agentname=None):
dic = {"`userName`": username,
"`phoneNumber`": phone,
"`dispost`": dispost_status,
"`agentName`": agentname}
print(dic)
sr = ""
if dic["`dispost`"] == "已繳納":
dic["`dispost`"] = "200"
elif dic["`dispost`"] == "未繳納":
dic["`dispost`"] = "0"
for k, v in dic.items():
if v:
sr += k + " = " + "'" + v + "'"+ " and "
print(sr.rstrip(" and "), 2222)
sql_fro = """select * from
(select user_list.`userId`, user_list.`userName`, order_list.`agentName`,
user_list.`headUrl`, user_list.`phoneNumber`, user_list.`balance`,
user_list.`dispost`, user_list.`registerTime`
from order_list join user_list on order_list.`userId` = user_list.`userId`)
as tmp
where """
sql = sql_fro + sr.rstrip(" and ")
print(sql, 33333)
sql_datas = mysql_func(sql)
# print(sql_datas)
user_datas = list()
for sql_data in sql_datas:
user_dic = dict()
userId = sql_data[0]
userName = sql_data[1]
agentName = sql_data[2]
headUrl = sql_data[3]
phoneNumber = sql_data[4]
balance = sql_data[5]
dispost = sql_data[6]
registerTime = sql_data[7]
user_dic["userId"] = userId
user_dic["userName"] = userName
user_dic["agentName"] = agentName
user_dic["headUrl"] = headUrl
user_dic["phoneNumber"] = phoneNumber
user_dic["balance"] = balance
if int(dispost) > 0:
user_dic["dispost_status"] = "已繳納"
else:
user_dic["dispost_status"] = "未繳納"
user_dic["registerTime"] = registerTime
user_datas.append(user_dic)
return user_datas
構造形式2
def consumer_order_post(start_time=None, end_time=None, order_number=None,
user_name=None, phone_number=None, agent_name=None):
"""
查詢條件
:param start_time: 開始條件
:param end_time: 結束條件
:param order_number: 訂單編號
:param user_name: 用戶昵稱
:param phone_number: 手機號
:param agent_name: 代理商
:return:
"""
dic = {"A.`startTime`": start_time,
"A.`endTime`": end_time,
"A.`orderNumber`": order_number,
"A.`userName`": user_name,
"A.`phoneNumber`": phone_number,
"A.`agentName`": agent_name
}
sr = ""
char = {"1": ">=",
"2": "<=",
"3": "="}
for key, value in dic.items():
if value:
if key == "A.`startTime`":
tmp = char.get("1")
elif key == "A.`endTime`":
tmp = char.get("2")
else:
tmp = char.get("3")
sr += key + tmp + "'" + value + "'" + " and "
print(sr.rstrip(" and "))