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

时间:2017-05-16 18:56:42

标签: python sql sqlite

不知何故,文档对我来说并不太清楚。我无法理解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

2 个答案:

答案 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']}.")