美文网首页SQLitesqlite
解决sqlite3查询数据返回字典格式的方法

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

作者: 柠檬C927 | 来源:发表于2022-07-22 16:45 被阅读0次

    问题:
    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导出代码,就能正常导出了。

    相关文章

      网友评论

        本文标题:解决sqlite3查询数据返回字典格式的方法

        本文链接:https://www.haomeiwen.com/subject/gnwmirtx.html