解决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导出代码,就能正常导出了。