Python 处理数据库返回结果
2013-12-17 22:10
465 查看
游标执行后返回的结果都只是数据,但是不带有列名标识。这里需要处理2个问题:
将返回的数据映射到每一列上
当返回的结果很大的时候,需要使用迭代器来提升性能。
解决上面的2个问题,在python里面可以采用下面的2种方式来处理。
使用namedtuple 和 map object。
使用yield 和 zip。
下面是示例代码:
需要注意几点:
使用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对象。
将返回的数据映射到每一列上
当返回的结果很大的时候,需要使用迭代器来提升性能。
解决上面的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对象。
相关文章推荐
- 我遇到的python错误及解决方法
- 使用python的numpy库实现PCA算法
- Python使用easy install安装BeautifulSoup
- python上传文件
- python科学计算一:pandas
- Python爬虫处理抓取数据中文乱码问题
- Python 学习入门(28)—— 服务器实例
- Python的IDE:Eclipse+PyDev配置
- PHP程序员函数习惯 Python实现 funlib
- python 学习笔记二
- SnowNLP:一个处理中文文本的 Python 类库
- Python学习笔记(四) 字典: 当索引不好用时
- 排序算法学习,python实现
- 1、Python基础知识
- python模块学习---getopt(命令行参数处理)
- python系列学习七——使用sqlite管理数据
- MonkeyRunner 写自动化测试用例
- python的Vim配置
- python 文件操作API整理
- Django中的Python高级特性