Python 处理数据库返回结果

游标执行后返回的结果都只是数据,但是不带有列名标识。这里需要处理2个问题:

  • 将返回的数据映射到每一列上
  • 当返回的结果很大的时候,需要使用迭代器来提升性能。

解决上面的2个问题,在python里面可以采用下面的2种方式来处理。

  1. 使用namedtuple 和 map object。
  2. 使用yield 和 zip。

下面是示例代码:

Result_From_DB# MySQL 数据库
import mysql
from mysql import connector
from collections import namedtuple

def generate_namedtuple(cur):
    from collections import namedtuple
    fieldnames = [d[0].lower() for d in cur.description]
    Record = namedtuple('Record', fieldnames)
    rows = cur.fetchall()    
    if not rows:return
    else:
        return map(Record._make, rows)
            
def generate_dicts(cur):
    fieldnames = [d[0].lower() for d in cur.description]
    while True:
        rows = cur.fetchmany()
        if not rows: return
        for row in rows:
            yield dict(zip(fieldnames, row))

if __name__ == '__main__':
    user = 'herbert'
    pwd = '851020'
    host = '127.0.0.1'
    db = 'world'
    cnx = mysql.connector.connect(user=user, password=pwd, host=host,database=db)
    cur = cnx.cursor()
    cur.execute("SELECT Name, CountryCode, District, Population FROM CITY\
                 where CountryCode = 'CHN' AND Population > 500000")

    for r in generate_dicts(cur):
        print(r['name'], r['population'])

    cur.execute("SELECT Name, CountryCode, District, Population FROM CITY\
                 where CountryCode = 'CHN' AND Population > 500000")

    print("-----------------------------")

    for k in generate_namedtuple(cur):
        print(k.name, k.population)

    cur.close()
    cnx.close()


 

需要注意几点:

  • 使用map和namedtuple的时候,游标要使用fetchall()方法。一次行取出所有结果,然后调用map方法将所有的数据map到Record object上。
  • 返回的map object可以调用for方法进行遍历。map object类似一个Record object列表。
  • namedtuple生成的对象,访问的时候是用dot来访问数据的。
  • 使用yield和dict zip返回的是iterator对象,这在性能上应该更有优势。
  • cur.fetchmany()返回的rowcount是有cursor.arraysize决定的。默认的是1,可以自行决定每次返回的数量。cur.fetchmany(size)
  • 使用yield和dict zip返回的iterator对象,每一个是一个dict对象。

转载于:https://www.cnblogs.com/herbert/p/3479349.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值