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

Vai*_* MK 5 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
Run Code Online (Sandbox Code Playgroud)

Ale*_*tov 10

将 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']}.")
Run Code Online (Sandbox Code Playgroud)


jua*_*aga 8

sqlite3文档

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

更远:

如果返回一个元组还不够,并且您想要对列进行基于名称的访问,您应该考虑将 row_factory 设置为高度优化的sqlite3.Row类型。Row提供对列的基于索引和不区分大小写的基于名称的访问,几乎没有内存开销。它可能比您自己的基于字典的自定义方法甚至基于 db_row 的解决方案更好。

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

所以这一行:

rv.row_factory = sqlite3.Row
Run Code Online (Sandbox Code Playgroud)

将 设置row_factory为 callable sqlite3.Row,这会将普通元组转换为更有用的对象。

所以现在,当您从数据库中提取行时,您将不会返回一个普通的 python tuple,而是一个特殊的对象,它使您更容易使用(例如,允许您使用名称访问列,而普通的元组会让您使用编号指数)。

  • 我阅读了文档。但这并没有让我清楚。你能用代码片段作为例子来解释吗? (3认同)
  • @VaishMK 什么不清楚?解释相当简单,因此您将不得不详细说明您不理解的内容。 (3认同)