python Mysql 多條件查詢


做項目時,遇到一場景,前端至少傳入一個參數,最多傳入四個參數,根據單參數或者組合參數,從數據庫篩選數據。

作為一個小白,思考之,從數學的角度,\(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 "))


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM