Ich spiele ein wenig mit der Python API für sqlite3, ich habe eine kleine Tabelle für Shop-Sprachen mit einem ID, Name und creation_date Felder. Ich versuche, die rohen Abfrageergebnisse in eine abzubilden, wie die Dokumente empfehlen, es auf diese Weise kann ich Zeilen in einer lesbareren Weise verwalten, also hier ist meine namedtuple
.Mapping Ergebnis Zeilen zu namedtuple in Python sqlite
LanguageRecord = namedtuple('LanguageRecord', 'id, name, creation_date')
Der Code, der die Dokumentation für die Abbildung vorschlägt, ist wie folgt:
for language in map(LanguageRecord._make, c.fetchall()):
# do something with languages
Das ist in Ordnung, wenn ich eine Sammlung von Sprachen zurückkehren will, aber in diesem Fall mag ich nur ein abrufen Sprache:
c.execute('SELECT * FROM language WHERE name=?', (name,))
So war mein erster Versuch es so etwas wie dieses:
language = map(LanguageRecord._make, c.fetchone())
Dieser Code nicht funktioniert nicht, weil fetchone()
ein Tupel zurück, anstatt eine Liste mit einem Tupel, so die map
Funktion versucht, drei namedtuples
einen für jeden Tupel Feld Gedanken zu erstellen.
Mein erster Ansatz zur Lösung dieses war explizit eine Liste zu erstellen, und wie es das Tupel Ergebnis etwas anfügen:
languages = []
languages.append(c.fetchone())
for language in map(LanguageRecord._make, languages):
# do something with language
Mein zweiter Ansatz war fetchall()
zu verwenden, obwohl ich einen Datensatz nur wollen. Ich kann das Namensfeld mit einer unique
Einschränkung in der Datenbank festlegen, um nur ein Ergebnis zu garantieren.
for language in map(LanguageRecord._make, c.fetchall()):
# do something with languages
konnte Ein anderer Ansatz Verwendung fetchall()[0]
ohne unique
constrain sein nur ein Ergebnis garantize.
Meine Frage ist, welche die beste und gebräuchlichste Methode ist, um mit diesem Problem umzugehen, sollte ich immer fetchall
verwenden, um eine gemeinsame Schnittstelle zu pflegen und die Datenbank die Eindeutigkeitslogik verwalten zu lassen? oder sollte ich explizit eine liste wie im ansatz 1 erstellen? Gibt es einen einfacheren Weg, um diese Aufgabe zu erfüllen?
Sie können auch die Datenbank-Cursor durchlaufen, gibt es keine Notwendigkeit, alle Datensätze zu holen, es sei denn, Sie wollen zu, so kann der Code als 'map (LanguageRecord._make, c)' umgeschrieben werden. –