Отображение строк результатов в 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? Есть ли более простой способ выполнить эту задачу?

Ответы на вопрос(3)

Ваш ответ на вопрос