sqlite3 Connection 对象的 row_factory 方法的用途是什么?

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

不知何故,文档对我来说并没有说得太清楚。我无法理解 sqlite3 Connection 对象的 row_factory 方法的用途。

基本上,您能解释一下以下片段吗?

def connect_db():
    """Connects to the specific database."""
    rv = sqlite3.connect(app.config['DATABASE'])
    rv.row_factory = sqlite3.Row
    return rv
python sql sqlite
2个回答
23
投票

sqlite3.Row
分配给连接的
row_factory
的代码行创建了一些人所说的“字典游标”, - 它开始在
fetchall
fetchone
之后返回“字典”行,而不是元组。

非常标准的例子:

import sqlite3 as sqlite

conn = sqlite.connect('companies_db.sqlite')

with conn:
    conn.row_factory = sqlite.Row
    curs = conn.cursor()
    curs.execute("SELECT * FROM companies_table")
    rows = curs.fetchall()
    for row in rows:
        print(f"{row['companyid']}, {row['name']}, {row['address']}.")

15
投票

来自

sqlite3
文档

您可以将此属性更改为接受光标的可调用属性 和原始行作为元组,并将返回真正的结果行。 这样,您可以实现更高级的返回结果的方式, 例如返回一个也可以按名称访问列的对象。

进一步:

如果返回元组还不够,并且您想要基于名称的访问 列,您应该考虑将 row_factory 设置为 高度优化的

sqlite3.Row
类型。
Row
提供基于索引的 以及对列的不区分大小写的基于名称的访问,几乎没有 内存开销。它可能会比你自己定制的更好 基于字典的方法,甚至基于 db_row 的解决方案。

您可以在 Flask 文档中找到相同类型的解释。

所以这一行:

rv.row_factory = sqlite3.Row

row_factory
设置为可调用的
sqlite3.Row
,它将普通元组转换为更有用的对象。

所以现在,当你从数据库中提取行时,你不会得到一个普通的 python

tuple
,而是一个特殊的对象,它可以更容易地使用(例如,允许你使用名称访问列,而普通的元组将让您使用编号索引)。

© www.soinside.com 2019 - 2024. All rights reserved.