游標執行后返回的結果都只是數據,但是不帶有列名標識。這里需要處理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對象。