Gram trochę z python api dla sqlite3, mam małą tabelę dla języków sklepu z identyfikatorami, nazwą i polami data_powstania. Próbuję odwzorować nieprzetworzone wyniki zapytania na namedtuple
, tak jak zalecają docs, w ten sposób mogę zarządzać wierszami w bardziej czytelny sposób, więc tutaj jest mój namedtuple
.Mapowanie wyników wierszy na namedtuple w python sqlite
LanguageRecord = namedtuple('LanguageRecord', 'id, name, creation_date')
Kod, który docs sugerują odwzorowania jest następujący:
for language in map(LanguageRecord._make, c.fetchall()):
# do something with languages
Jest to dobre rozwiązanie, gdy chcę wrócić zbiór języków, ale w tym przypadku chcę tylko do pobierania jednego język:
c.execute('SELECT * FROM language WHERE name=?', (name,))
Więc moja pierwsza próba to było coś takiego:
language = map(LanguageRecord._make, c.fetchone())
Ten kod nie działa, ponieważ fetchone()
zwraca krotki zamiast listę z jednej krotki, więc funkcja map
próbuje utworzyć trzy namedtuples
jednym dla każdej myśli pola krotka.
Moje pierwsze podejście do rozwiązania tego problemu było wyraźnie utworzyć listę i dołączyć do niego wynik krotka, coś takiego:
languages = []
languages.append(c.fetchone())
for language in map(LanguageRecord._make, languages):
# do something with language
Drugie podejście było użyć fetchall()
chociaż chcę tylko jeden rekord. Mogę ustawić pole nazwy z ograniczeniem unique
w bazie danych, aby zagwarantować tylko jeden wynik.
for language in map(LanguageRecord._make, c.fetchall()):
# do something with languages
Innym rozwiązaniem mogłoby być wykorzystanie fetchall()[0]
bez unique
ograniczyć do garantize tylko jeden wynik.
Moje pytanie brzmi: jaki jest najlepszy i najpowszechniejszy sposób radzenia sobie z tym problemem, czy powinienem używać zawsze fetchall
, aby utrzymywać wspólny interfejs i pozwolić bazie danych zarządzać logiką unikalności? czy powinienem utworzyć listę jawnie jak w podejściu 1? Czy istnieje łatwiejszy sposób na wykonanie tego zadania?
Można również iteracyjne nad kursorem bazy danych, nie ma potrzeby, aby pobrać wszystkie rekordy, chyba że chcesz do, więc kod można przepisać jako 'map (LanguageRecord._make, c)'. –