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?