不知何故,文档对我来说并不太清楚。我无法理解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
答案 0 :(得分:2)
来自sqlite3
docs:
您可以将此属性更改为接受游标的可调用对象 并将原始行作为元组并返回实际结果行。 这样,您可以实现更高级的返回结果的方法, 例如返回一个也可以按名称访问列的对象。
此外:
如果返回元组是不够的,并且您需要基于名称的访问权限 列,你应该考虑将row_factory设置为 高度优化的
sqlite3.Row
类型。Row
提供基于索引的 和不区分大小写的基于名称的列访问几乎没有 内存开销。它可能比你自己的习惯更好 基于字典的方法甚至是基于db_row的解决方案。
您可以在Flask docs中找到相同类型的解释。
所以这一行:
rv.row_factory = sqlite3.Row
将row_factory
设置为可调用sqlite3.Row
,它将普通元组转换为更有用的对象。
所以现在,当你从数据库中提取行时,你不会得到一个普通的python tuple
,但是一个特殊的对象可以让它更容易使用(例如,允许你使用名称,而普通元组将使您使用编号索引)。
答案 1 :(得分:2)
将sqlite3.Row分配给连接的row_factory的代码行创建了一些人所说的“字典游标”,-它不是元组,而是在fetchall或fetchone之后开始返回“字典”行。
标准示例:
import sqlite3 as sqlite
conn = sqlite.connect('companies_db.sqlite')
with conn:
conn.row_factory = sqlite.Row
curs = con.cursor()
curs.execute("SELECT * FROM companies_table")
rows = curs.fetchall()
for row in rows:
print(f"{row['companyid']}, {row['name']}, {row['address']}.")