db = sqlite.connect("test.sqlite")
res = db.execute("select * from table")
Mit der Iteration erhalte ich Listen, die den Zeilen entsprechen.
for row in res:
print row
Ich kann den Namen der Spalten erhalten
col_name_list = [tuple[0] for tuple in res.description]
Aber gibt es eine Funktion oder Einstellung, um Wörterbücher anstelle von Listen zu erhalten?
{'col1': 'value', 'col2': 'value'}
oder muss ich mich machen
python
sql
sqlite
dictionary
dataformat
Meloun
quelle
quelle
Antworten:
Sie können row_factory verwenden , wie im Beispiel in den Dokumenten:
oder befolgen Sie die Ratschläge, die direkt nach diesem Beispiel in den Dokumenten gegeben werden:
quelle
SELECT 1 AS "dog[cat]"
dann diecursor
haben nicht die korrekte Beschreibung eines dict zu erstellen.connection.row_factory = sqlite3.Row
und versucht,connection.row_factory = dict_factory
wie gezeigt, abercur.fetchall()
gibt mir immer noch eine Liste von Tupeln - eine Idee, warum dies nicht funktioniert?collections.namedtuple
. Wenn ich benutze,cur.fetchmany()
bekomme ich Einträge wie<sqlite3.Row object at 0x...>
.Ich dachte, ich beantworte diese Frage, obwohl die Antwort teilweise in den Antworten von Adam Schmideg und Alex Martelli erwähnt wird. Damit andere wie ich, die die gleiche Frage haben, die Antwort leicht finden können.
quelle
fetchall()
scheintsqlite3.Row
Objekte zurückzugeben. Diese können jedoch einfach mitdict()
: in ein Wörterbuch konvertiert werdenresult = [dict(row) for row in c.fetchall()]
.Selbst wenn Sie die Klasse sqlite3.Row verwenden, können Sie die Zeichenfolgenformatierung nicht in der folgenden Form verwenden:
Um dies zu überwinden, verwende ich eine Hilfsfunktion, die die Zeile übernimmt und in ein Wörterbuch konvertiert. Ich verwende dies nur, wenn das Wörterbuchobjekt dem Zeilenobjekt vorzuziehen ist (z. B. für Dinge wie die Formatierung von Zeichenfolgen, bei denen das Zeilenobjekt die Wörterbuch-API nicht nativ unterstützt). Verwenden Sie das Row-Objekt jedoch alle anderen Male.
quelle
print "%(id)i - %(name)s: %(value)s" % dict(row)
Nachdem Sie eine Verbindung zu SQLite hergestellt haben, reicht
con = sqlite3.connect(.....)
es aus, nur Folgendes auszuführen:Voila!
quelle
Aus PEP 249 :
Also ja, mach es selbst.
quelle
Kürzere Version:
quelle
Am schnellsten bei meinen Tests:
vs:
Du entscheidest :)
quelle
Ähnlich wie die oben genannten Lösungen, aber am kompaktesten:
quelle
db.row_factory = sqlite3.Row
für mich nicht funktionierten (da dies zu einem JSON TypeError führte)Wie in der Antwort von @ gandalf erwähnt, muss man verwenden
conn.row_factory = sqlite3.Row
, aber die Ergebnisse sind keine direkten Wörterbücher.dict
In der letzten Schleife muss eine zusätzliche "Besetzung" hinzugefügt werden :quelle
Ich denke, Sie waren auf dem richtigen Weg. Lassen Sie uns dies sehr einfach halten und vervollständigen, was Sie versucht haben:
Der Nachteil ist
.fetchall()
der Mord an Ihrem Speicherverbrauch , wenn Ihr Tisch sehr groß ist. Für einfache Anwendungen, die nur wenige Tausend Textzeilen und numerische Spalten betreffen, ist dieser einfache Ansatz jedoch ausreichend.Für ernsthafte Dinge sollten Sie sich Reihenfabriken ansehen, wie in vielen anderen Antworten vorgeschlagen.
quelle
Oder Sie können die sqlite3.Rows wie folgt in ein Wörterbuch konvertieren. Dies gibt ein Wörterbuch mit einer Liste für jede Zeile.
quelle
Eine generische Alternative mit nur drei Zeilen
Wenn Ihre Abfrage jedoch nichts zurückgibt, führt dies zu einem Fehler. In diesem Fall...
oder
quelle
Das Ergebnis ist definitiv wahr, aber ich weiß nicht das Beste.
quelle
Wörterbücher in Python bieten beliebigen Zugriff auf ihre Elemente. Jedes "Wörterbuch" mit "Namen", obwohl es einerseits informativ sein könnte (auch bekannt als die Feldnamen), "ordnet" die Felder "auf", was möglicherweise unerwünscht ist.
Am besten erhalten Sie die Namen in einer separaten Liste und kombinieren sie bei Bedarf selbst mit den Ergebnissen.
Denken Sie auch daran, dass die Namen in allen Ansätzen die Namen sind, die Sie in der Abfrage angegeben haben, nicht die Namen in der Datenbank. Ausnahme ist die
SELECT * FROM
Wenn Sie nur die Ergebnisse mit einem Wörterbuch erhalten möchten, verwenden Sie auf jeden Fall das
conn.row_factory = sqlite3.Row
(bereits in einer anderen Antwort angegeben).quelle