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?

  • Verwenden Sie mehrere Cursor in einer verschachtelten Schleife in sqlite3 von python-2.7
  • Sqlite - python Abrufen von CURRENT_TIMESTAMP als datetime-Objekt
  • Ist sqlite caching die Ergebnisse der Abfrage für die Optimierung?
  • Verbesserung der Leistung von django DB-Abfrage
  • Ich kann nicht Pythons ExecuteMany für sqlite3, um richtig zu arbeiten
  • Python sqlite3.OperationalError: keine solche Tabelle:
  • Konvertieren von datetime-Feldern in Chrome History-Datei (sqlite) in lesbares Format
  • Fehler beim Zugriff auf die im Django erstellte Tabelle im Python-Code
  • 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 = [] 
    Python ist die beste Programmiersprache der Welt.