我正在使用sqlite3的python api,我有一个带有id,name和creation_date字段的商店语言的小表.我试图将原始查询结果映射到namedtuple文档推荐的那个,这样我可以以更易读的方式管理行,所以这是我的namedtuple.
LanguageRecord = namedtuple('LanguageRecord', 'id, name, creation_date')
Run Code Online (Sandbox Code Playgroud)
文档为映射建议的代码如下:
for language in map(LanguageRecord._make, c.fetchall()):
# do something with languages
Run Code Online (Sandbox Code Playgroud)
当我想返回一组语言时,这很好,但在这种情况下,我只想检索一种语言:
c.execute('SELECT * FROM language WHERE name=?', (name,))
Run Code Online (Sandbox Code Playgroud)
所以我的第一次尝试是这样的:
language = map(LanguageRecord._make, c.fetchone())
Run Code Online (Sandbox Code Playgroud)
此代码不起作用,因为fetchone()返回一个元组而不是一个具有一个元组的列表,因此该map函数尝试namedtuples为每个元组字段思想创建三个.
我解决这个问题的第一种方法是显式创建一个列表并将其附加到元组结果,例如:
languages = []
languages.append(c.fetchone())
for language in map(LanguageRecord._make, languages):
# do something with language
Run Code Online (Sandbox Code Playgroud)
我的第二种方法是使用fetchall()虽然我只想要一条记录.我可以unique在数据库中使用约束设置名称字段,以便仅对一个结果进行garantize.
for language in map(LanguageRecord._make, c.fetchall()):
# do something with languages
Run Code Online (Sandbox Code Playgroud)
另一种方法可以在fetchall()[0]没有unique约束的情况下使用,仅仅对一个结果进行garantize.
我的问题是哪种方法是处理这个问题的最好和最常用的方法,我应该总是使用fetchall …