您的位置:首页 > 编程语言 > Python开发

Python 处理数据库返回结果

2013-12-17 22:10 465 查看
游标执行后返回的结果都只是数据,但是不带有列名标识。这里需要处理2个问题:

将返回的数据映射到每一列上

当返回的结果很大的时候,需要使用迭代器来提升性能。

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

使用namedtuple 和 map object。

使用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对象。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: