SQLitesqlite

解决sqlite3查询数据返回字典格式的方法

2022-07-22  本文已影响0人  柠檬C927

问题:
python使用 sqlite3 数据库进行增删改查时发现,sqlite3查询数据返回的元组,会导致我使用csv库导出数据时会报错。
如下图,是sqlite3最初查询返回的数据格式:

源码:

import sqlite3

conn = sqlite3.connect('show.db.php')
cursor = conn.cursor()

def catalog_page_num():
    sql_catalog = 'SELECT a.cat_name,COUNT(b.page_id) FROM catalog a  LEFT JOIN page b ON a.cat_id=b.cat_id GROUP BY cat_name'
    cursor.execute(sql_catalog)
    data_catalog = cursor.fetchall()
    print('  类名     文章数')
    for d in data_catalog:
        print(d)

catalog_page_num()

执行结果:


image.png

原因:sqlite3本身并没有原生提供字典形式的游标,(adodb、pymysql等其他库有)

解决:官方文档里已经有预留了相应的实现方案,如下图,重写重写 row_factory 方法后,查询数据返回的就是字典!

import sqlite3

conn = sqlite3.connect('show.db.php')


# 重写row_factory方法,然后调用
def dict_factory(cursor, row):
    d = {}
    for idx, col in enumerate(cursor.description):
        d[col[0]] = row[idx]
    return d

def catalog_page_num():
    sql_catalog = 'SELECT a.cat_name,COUNT(b.page_id) FROM catalog a  LEFT JOIN page b ON a.cat_id=b.cat_id GROUP BY cat_name'
    conn.row_factory = dict_factory  # 重写 row_factory 方法后,查询数据返回的就是字典!
    cursor = conn.cursor()
    cursor.execute(sql_catalog)
    data_catalog = cursor.fetchall()
    print('  类名     文章数')
    for d in data_catalog:
        print(d)

catalog_page_num()

执行结果如下:


image.png

在此加上csv导出代码,就能正常导出了。

上一篇下一篇

猜你喜欢

热点阅读