2012-11-14 2 views
6

Zur Zeit habe ich den folgenden Code:Wie wähle ich eine Spalte nach ihrem Namen aus? (Python & SQLite3)

c.execute("SELECT * FROM table") 
for row in c.fetchall(): 
    print row[0] 
    print row[1] 

Jedoch änderte ich die Struktur von meinem Tisch und jetzt habe ich die Indexwerte zu ändern, um diese Änderung zu repräsentieren. Gibt es eine Möglichkeit, stattdessen Spaltennamen zu verwenden?

Antwort

9

Siehe Row Objects in der Dokumentation für das sqlite3-Modul. Wenn Sie die sqlite3.Row row_factory verwenden werden Sie ein Objekt zurück, das als die normalen Tupeln etwas stärker ist. Ich kann mir vorstellen, dass der Overhead etwas höher ist und daher nicht das Standardverhalten ist.

+1

keine wirkliche höheren Overhead: _ "Row bietet sowohl indexbasierte und Groß- und Kleinschreibung Namen -basierten Zugang zu Spalten ** mit fast keinem Speicher-Overhead **. Es wird wahrscheinlich besser sein als Ihr eigenen Wörterbuch-basierter Ansatz oder sogar eine db_row basierte Lösung. "_ http://docs.python.org/3/library /sqlite3.html#sqlite3.Connection.row_factory – JeromeJ

+0

Ja, das macht Sinn - ich habe nicht auf den Code gesucht, aber es wahrscheinlich verwendet nur '__getitem__' Spaltennamen in ihre entsprechenden Indizes abzubilden. – Iguananaut

8

Aus diesem Grund empfiehlt es sich, immer explizite Spaltennamen zu verwenden, wenn eine SELECT tun: nach dem doc

c.execute("SELECT color, fluffiness FROM table") 
for row in c.fetchall(): 
    print row[0]   # <-- is always guaranteed to be the color value 
    print row[1] 
+1

Das ist auch eine gute Antwort. Oder eine Kombination davon. Obwohl es ein Schmerz sein kann, dass Sie alle Spalten einer großen Tabelle abrufen. – Iguananaut