python MYSQL執行sql語句查詢結果轉化為內容為字典的列表方便交互


  部分公司出於安全,數據表過於復雜亦或者是其他方面的考慮,往往會希望直接用pymysql寫原生sql語句去編寫后台代碼而不是使用orm之類技術去實現數據的獲取。但是如此做的話,就會把數據庫查詢的結果作為請求的參數,但是原生sql返回的字段往往是元組嵌套元組結果集的形式,即((1,3),(2,3)),其中內嵌的兩個元組即我們查詢的結果集的值。這樣會導致我們無法准確的獲取值所對應的關鍵字。並且獲取的值只能受限元組的順序,無法靈活應用不適合交互。所以我們希望返回的數據能夠像orm技術一樣返回的單條數據結果就是字典,返回結果為多條數據時可以統一放在列表中以便於遍歷。

  要想達到這樣的轉換效果。首先看看是如何實現原生語句的獲取的。這是一個用以sql查詢單條或者多條數據的方法。以size=0可以判斷是否需要fetchall全部查詢。

  

def find_info(table,orderdict, size=1):
    '''
    :param table: str 所查詢的表
    :param orderdict:  dict 關鍵字值的字典
    :return:
    '''
    key_list = list(orderdict.keys())
    value_tuple = tuple(orderdict.values())
    print(key_list,value_tuple)
    for key in key_list:
        if key == key_list[0]:
            sql = "select * from {} where {}=%s".format(table, key)
        else:
            sql = sql + 'and {}=%s'.format(key)
    try:
        cursor.execute(sql, value_tuple)
        data_dict= cursor.fetchmany(size)
        cursor.close()
        connection.close()
        return data_dict
    except:
        return {'msg':'表格不存在,查詢有誤'}

  這個時候假設我們需要查詢res = find_info('useinfo',{'name':1},1),此時返還的會是像((1,1,30),(2,1,40))的結果集。如果我們在執行后加入desc = cursor.description並且打印他,就會發現我們需要的關鍵字id,name,age就會出現即desc[0]。

  有了關鍵字,我們再和結果集一一對應打包成字典就不在話下了。完整代碼如下

def find_info(table,orderdict, size=1):
    '''
    :param table: str 所查詢的表
    :param orderdict:  dict 關鍵字值的字典
    :return:
    '''
    key_list = list(orderdict.keys())
    value_tuple = tuple(orderdict.values())
    print(key_list,value_tuple)
    for key in key_list:
        if key == key_list[0]:
            sql = "select * from {} where {}=%s".format(table, key)
        else:
            sql = sql + 'and {}=%s'.format(key)
    try:
        cursor.execute(sql, value_tuple)
        desc = cursor.description
        if size:
            result = cursor.fetchmany(size)
        else:
            result = cursor.fetchall()
        data_dict = [dict(zip([col[0] for col in desc], row)) for row in result]
        cursor.close()
        connection.close()
        return data_dict
    except:
        return {'msg':'表格不存在'}
res = find_info('useinfo',{'name':1},1)

  返回結果[{‘id’:1,'name': '1', 'age': '40'}]。

  


免責聲明!

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



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