Holen Sie sich eine Liste von Feldwerten aus Python's sqlite3, nicht Tupel, die Zeilen darstellen

Es ist nervig, wie Pythons sqlite3 Modul immer eine Liste von Tupeln zurückgibt! Wenn ich eine einzelne Spalte abfrage, würde ich lieber eine einfache Liste bekommen.

ZB wenn ich ausführen

 SELECT somecol FROM sometable 

Und ruf an

 cursor.fetchall() 

Es kommt zurück

 [(u'one',), (u'two',), (u'three',)] 

Aber ich würde lieber nur bekommen

 [u'one', u'two', u'three'] 

Gibt es einen Weg, dies zu tun?

5 Solutions collect form web for “Holen Sie sich eine Liste von Feldwerten aus Python's sqlite3, nicht Tupel, die Zeilen darstellen”

Sie wollen das nicht wirklich tun – alles, was Sie tun, entlang der Linien der Verwendung von Zip oder ein Listen-Verständnis ist nur essen CPU-Zyklen und saugen Speicher ohne signifikanten Wert. Du bist viel besser gedient, nur mit den Tupeln umzugehen.

Wieso gibt es Tupel, es ist, weil das ist, was die Python DBD API 2.0 von fetchall benötigt.

sqlite3.Connection hat ein row_factory Attribut.

In der Dokumentation heißt es:

Sie können dieses Attribut auf einen Aufruf ändern, der den Cursor und die ursprüngliche Zeile als Tupel akzeptiert und die reale Ergebniszeile zurückgibt. Auf diese Weise können Sie erweiterte Möglichkeiten zur Rückgabe von Ergebnissen implementieren, z. B. das Zurückgeben eines Objekts, das auch auf Spalten zugreifen kann.

Um eine Liste von Einzelwerten aus einer SELECT , z. B. einer id , zurückzugeben, können Sie eine row_factory lambda zu row_factory zuweisen, die den ersten indizierten Wert in jeder Zeile zurückgibt. z.B:

 import sqlite3 as db conn = db.connect('my.db') conn.row_factory = lambda cursor, row: row[0] c = conn.cursor() ids = c.execute('SELECT id FROM users').fetchall() 

Das ergibt so etwas wie:

 [1, 2, 3, 4, 5, 6] # etc. 
 data=cursor.fetchall() COLUMN = 0 column=[elt[COLUMN] for elt in data] 

(Meine vorherige column=zip(*data)[COLUMN] , column=zip(*data)[COLUMN] , hebt einen IndexError wenn data ein leeres Tupel sind. Im Gegensatz dazu erstellt das Listenverständnis nur eine leere Liste. Je nach Situation kann die Erhöhung eines IndexError vorzuziehen sein , Aber ich werde das dir überlassen, um zu entscheiden.)

Ich benutze die Modul- Pandas , um mit Tisch-ähnlichen Inhalt umzugehen:

 df = pd.DataFrame(cursor.fetchall(), columns=['one','two']) 

Die Liste der Werte für Spalte 'Eins' wird einfach als:

 df['one'].values 

Sie können sogar einen eigenen Index für die Datenreferenz verwenden:

 df0 = pd.DataFrame.from_records(cursor.fetchall(), columns=['Time','Serie1','Serie2'],index='Time') 

Für den Fall, dass cursor.fetchall () eine leere Liste zurückgibt:

 try: columnlist = list(zip(*cursor.fetchall())[COLUMN_INDEX]) except IndexError: columnlist = [] 
  • Untersuchen dann die Aktualisierung von Zeilen in sqlite mit Python
  • Python 2.7.3 _sqlite3-Modul wird nicht nach dem Übergeben von Header / Bibliotheken gebaut
  • Wie kann ich eine In-Memory-SQLite-Datenbank in Python anhängen?
  • Python SQLite3 SQL Injection Vulnerable Code
  • Programmierfehler: Falsche Anzahl der gelieferten Bindungen
  • Wie man ein Auto-Inkrement-Integer-Feld Django macht
  • Verbesserung der Leistung von django DB-Abfrage
  • Importieren einer CSV-Datei in eine sqlite3-Datenbanktabelle mit Python
  • Python - SQLite JSON1 Ladeerweiterung
  • SQLite3 Python: executemany SELECT
  • Speichern Sie SQLite 3 Daten als Variable in Python
  • Python ist die beste Programmiersprache der Welt.