我正在使用sqlite3的python 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’]访问等效项.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。