如何从 Python 中的 SQLite 查询返回支持字典和点符号的对象?

问题描述 投票:0回答:1

我有以下用于 sqlite3 查询的代码。我希望能够使用索引、字典和点表示法来访问行属性。使用

sqlite3.Row
row_factory 允许索引和字典访问,但不允许访问点符号。

import sqlite3
conn = sqlite3.connect(':memory:')
conn.row_factory = sqlite3.Row
cur = conn.cursor()
cur.execute("CREATE TABLE movie(title, year, score)")
cur.execute("""
    INSERT INTO movie VALUES
        ('Monty Python and the Holy Grail', 1975, 1.2),
        ('And Now for Something Completely Different', 1971, 2.3)
""")
conn.commit()
results = conn.execute("select * from movie;")
for r in results:
    print(r[0], r['title'], r.title)
    # ---> `r.title` AttributeError: 'sqlite3.Row' object has no attribute 'title'

存在一个点表示法 row_factory ,但我不知道如何合并两者。这不支持字典表示法,

from collections import namedtuple

def namedtuple_factory(cursor, row):
    """Returns sqlite rows as named tuples."""
    fields = [col[0] for col in cursor.description]
    Row = namedtuple("Row", fields)
    return Row(*row)
python sqlite attributes notation
1个回答
0
投票

您可以先将其转换为字典,然后通过 dict dunder 方法设置点符号访问。

class dotdict(dict):
    """dot.notation access to dictionary attributes"""
    __getattr__ = dict.get
    __setattr__ = dict.__setitem__
    __delattr__ = dict.__delitem__


def row_factory(cursor, data):
    keys = [col[0] for col in cursor.description]
    d = {k: v for k, v in zip(keys, data)}
    return dotdict(d)
© www.soinside.com 2019 - 2024. All rights reserved.