Отображение строк результатов в namedtuple в Python SQLite
Я немного играю с Python API для sqlite3, у меня есть небольшая таблица для языков магазина с полями id, name и creation_date. Я пытаюсь отобразить необработанные результаты запроса вnamedtuple
как рекомендуют документы, таким образом я могу управлять строками более читабельным образом, так что вот мое.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
функция пытается создать триnamedtuples
по одному на каждое поле кортежа мысли.
Мой первый подход к решению этой проблемы состоял в том, чтобы явно создать список и добавить к нему результат кортежа, что-то вроде:
languages = []
languages.append(c.fetchone())
for language in map(LanguageRecord._make, languages):
# do something with language
Мой второй подход заключался в использованииfetchall()
хотя я просто хочу одну запись. Я могу установить поле имени сunique
ограничить в базе данных, чтобы гарантировать только один результат.
for language in map(LanguageRecord._make, c.fetchall()):
# do something with languages
Другой подход может быть использованfetchall()[0]
безunique
ограничить, чтобы гарантировать только один результат.
Мой вопрос - какой самый лучший и распространенный способ справиться с этой проблемой, должен ли я всегда использоватьfetchall
сохранить общий интерфейс и позволить базе данных управлять логикой уникальности? или я должен создать список явно, как в подходе 1? Есть ли более простой способ выполнить эту задачу?