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