将结果行映射到python sqlite中的namedtuple

我正在使用sqlite3python api,我有一个带有id,name和creation_date字段的商店语言的小表.我正在尝试将原始查询结果映射到文档推荐的命名元组,这样我就可以以更易读的方式管理行,所以这是我的namedtuple.

LanguageRecord = namedtuple('LanguageRecord', 'id, name, creation_date')

文档为映射建议的代码如下:

for language in map(LanguageRecord._make, c.fetchall()):
  # do something with languages

当我想要返回一组语言时,这很好,但在这种情况下我只想要
检索一种语言:

c.execute('SELECT * FROM language WHERE name=?', (name,))

所以我的第一次尝试是这样的:

language = map(LanguageRecord._make, c.fetchone())

代码不起作用,因为fetchone()返回一个元组而不是一个带有一个元组的列表,
所以map函数试图为每个元组字段思想创建一个命名元组.

解决这个问题的第一种方法是显式创建一个列表并将其附加到元组结果,例如:

languages = []
languages.append(c.fetchone())
for language in map(LanguageRecord._make, languages):
  # do something with language

我的第二种方法是使用fetchall(),虽然我只想要一条记录.我可以设定
名称字段,在数据库中具有唯一约束,以便仅对一个结果进行garantize.

for language in map(LanguageRecord._make, c.fetchall()):
  # do something with languages

另一种方法可能是使用fetchall()[0]而没有唯一约束来仅仅对一个结果进行garantize.

我的问题是哪种方法是处理这个问题的最好和最常用的方法,我应该总是使用fetchall来维护一个公共接口并让数据库管理唯一性逻辑吗?或者我应该如方法1中那样明确地创建列表?有没有更简单的方法来完成这项任务?

解决方法:

一个更简单的方法sqlite3用户提供了一种定义“row factories”方法.这些行工厂接受游标和元组行,并且可以返回它想要的任何类型的对象.

一旦你设置了行工厂

con.row_factory = my_row_factory

然后光标返回的行将是my_row_factory应用于元组行的结果.例如,

import sqlite3
import collections

LanguageRecord = collections.namedtuple('LanguageRecord', 'id name creation_date')
def namedtuple_factory(cursor, row):
    return LanguageRecord(*row)

con = sqlite3.connect(":memory:")
con.row_factory = namedtuple_factory
cur = con.cursor()
cur.execute("select 1,2,3")
print(cur.fetchone())

产量

LanguageRecord(id=1, name=2, creation_date=3)

有关如何定义namedtuple工厂的另一个示例,请参阅this post.

顺便说一句,如果你设置

conn.row_factory = sqlite3.Row

然后行返回为dicts,其键是表的列名.因此,不是使用row.creation_date之类的东西访问namedtuple的部分,而是可以使用内置的sqlite3.Row行工厂并使用row [‘creation_date’]访问等效项.

相关文章

SQLite架构简单,又有Json计算能力,有时会承担Json文件/RES...
使用Python操作内置数据库SQLite以及MySQL数据库。
破解微信数据库密码,用python导出微信聊天记录
(Unity)SQLite 是一个软件库,实现了自给自足的、无服务器...
安卓开发,利用SQLite实现登陆注册功能