Mapowanie wierszy wyników do namedtuple w python sqlite

Gram trochę z python api dla sqlite3, mam małą tabelę dla języków sklepowych z polami id, name i creation_date. Próbuję odwzorować wyniki surowego zapytania nanamedtuple zgodnie z zaleceniami doktorów, w ten sposób mogę zarządzać wierszami w bardziej czytelny sposób, więc oto mójnamedtuple.

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

Kod sugerowany przez dokumentację dla mapowania jest następujący:

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

To jest w porządku, gdy chcę zwrócić zbiór języków, ale w tym przypadku chcę tylko pobrać jeden język:

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

Tak więc moja pierwsza próba była następująca:

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

Ten kod nie działa, ponieważfetchone() zwraca krotkę zamiast listy z jedną krotką, więcmap funkcja próbuje utworzyć trzynamedtuples jeden dla każdego pola krotki.

Moim pierwszym podejściem do rozwiązania tego problemu było jawne utworzenie listy i dodanie do niej wyniku krotki, np .:

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

Moje drugie podejście polegało na użyciufetchall() chociaż chcę tylko jedną płytę. Mogę ustawić pole nazwy za pomocąunique ograniczać w bazie danych, aby uzyskać tylko jeden wynik.

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

Można zastosować inne podejściefetchall()[0] bezunique ograniczać do zdobycia tylko jednego wyniku.

Moje pytanie brzmi: jaki jest najlepszy i najczęstszy sposób radzenia sobie z tym problemem, powinienem zawsze używaćfetchall utrzymać wspólny interfejs i pozwolić bazie danych zarządzać logiką unikalności? czy powinienem utworzyć listę jawnie jak w podejściu 1? Czy jest łatwiejszy sposób na wykonanie tego zadania?

questionAnswers(3)

yourAnswerToTheQuestion