不知何故,文档对我来说并没有说得太清楚。我无法理解 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
将
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']}.")
sqlite3
文档:
您可以将此属性更改为接受光标的可调用属性 和原始行作为元组,并将返回真正的结果行。 这样,您可以实现更高级的返回结果的方式, 例如返回一个也可以按名称访问列的对象。
进一步:
如果返回元组还不够,并且您想要基于名称的访问 列,您应该考虑将 row_factory 设置为 高度优化的
类型。sqlite3.Row
提供基于索引的 以及对列的不区分大小写的基于名称的访问,几乎没有 内存开销。它可能会比你自己定制的更好 基于字典的方法,甚至基于 db_row 的解决方案。Row
您可以在 Flask 文档中找到相同类型的解释。
所以这一行:
rv.row_factory = sqlite3.Row
将
row_factory
设置为可调用的 sqlite3.Row
,它将普通元组转换为更有用的对象。
所以现在,当你从数据库中提取行时,你不会得到一个普通的 python
tuple
,而是一个特殊的对象,它可以更容易地使用(例如,允许你使用名称访问列,而普通的元组将让您使用编号索引)。