Frage

Ich benutze sqlite3 in Python 2.5. Ich habe eine Tabelle erstellt, die wie folgt aussieht:

   create table votes (
      bill text,
      senator_id text,
      vote text)

Ich bin es mit so etwas wie dies den Zugriff auf:

v_cur.execute("select * from votes")
row = v_cur.fetchone()
bill = row[0]
senator_id = row[1]
vote = row[2]

Was ich möchte in der Lage sein zu tun hat fetchone (oder eine andere Methode) liefert einen Wörterbuch, anstatt eine Liste, so dass ich nach Namen auf das Gebiet beziehen, anstatt Position. Zum Beispiel:

bill = row['bill'] 
senator_id = row['senator_id']
vote = row['vote']

Ich weiß, Sie können mit MySQL dies zu tun, aber nicht jeder wissen, wie es mit SQLite zu tun?

Danke !!!

War es hilfreich?

Lösung

So wie ich dies in der Vergangenheit getan haben:

def dict_factory(cursor, row):
    d = {}
    for idx,col in enumerate(cursor.description):
        d[col[0]] = row[idx]
    return d

Dann setzen Sie es in Ihrer Verbindung ein:

from pysqlite2 import dbapi2 as sqlite
conn = sqlite.connect(...)
conn.row_factory = dict_factory

Das funktioniert unter pysqlite-2.4.1 und Python 2.5.4.

Andere Tipps

Es gibt tatsächlich eine Option für diese in sqlite3. Ändern Sie den row_factory Mitglied des Verbindungsobjekts zu sqlite3.Row:

conn = sqlite3.connect('db', row_factory=sqlite3.Row)

oder

conn.row_factory = sqlite3.Row

Damit können Sie Zeilenelemente mit Namen zuzugreifen - Wörterbuch-style - oder Index. Dies ist viel effizienter als die eigene Work-around zu schaffen.

Ich habe versucht, vor kurzem etwas ähnliches zu tun, während sqlite3.Row () verwenden. Während sqlite3.Row () groß ist, eine Wörterbuch-ähnliche Oberfläche oder ein Tupel wie Schnittstelle für die Bereitstellung, funktionierte es nicht, wenn ich in der Zeile mit ** kwargs geleitet. So benötigte einen schnellen Weg, es zu einem Wörterbuch umzuwandeln. Ich erkennen, dass die Reihe () Objekt kann mit itertools in ein Wörterbuch einfach umgewandelt werden.

Python 2:

db.row_factory = sqlite3.Row
dbCursor = db.cursor()
dbCursor.execute("SELECT * FROM table")
row = dbCursor.fetchone()

rowDict = dict(itertools.izip(row.keys(), row))

oder in Python 3, einfacher:

dbCursor = db.cursor()
dbCursor.execute("SELECT * FROM table")
row = dbCursor.fetchone()
rowDict = dict(zip([c[0] for c in dbCursor.description], row))

In ähnlicher Weise können Sie die dbCursor.fetchall () Befehl verwenden und die gesamte Menge von Zeilen zu einer Liste von Wörterbüchern in einer for-Schleife konvertieren.

Sicher, machen Sie sich eine DictConnection und DictCursor wie erläutert und gezeigt unter http: //trac.edgewall.org/pysqlite.org-mirror/wiki/PysqliteFactories zum Beispiel.

Ich weiß, dass du das nicht fragen, aber warum nicht nur sqlalchemy verwende ein ORM für die Datenbank zu bauen? dann können Sie tun Dinge wie:


entry = model.Session.query(model.Votes).first()
print entry.bill, entry.senator_id, entry.vote

als zusätzliche Bonus Code wird zu einer alternativen Datenbank leicht tragbar sein und Verbindungen und so weiter werden kostenlos verwaltet werden.

Ich habe verwendet, um diese:

def get_dict(sql):
    return dict(c.execute(sql,()).fetchall())

Dann können Sie dies tun:

c = conn.cursor()
d = get_dict("select user,city from vals where user like 'a%'");

Jetzt d ist ein Wörterbuch, in dem der Schlüssel user und die Werte sind city. Dies funktioniert auch für group by

Ich verwende etwas wie folgt aus:

class SqliteRow(object):
    def __init__(self):
        self.fields = []

    def add_field(self, name, value):
        self.fields.append(name)
        setattr(self, name, value)

    def to_tuple(self):
        return tuple([getattr(self, x) for x in self.fields])

mit dieser:

def myobject_factory(cursor, row):
    myobject= MyObject()
    for idx, col in enumerate(cursor.description):
        name, value = (col[0], row[idx])

        myobject.add_field(name, value)
    return myobject

MyObject() ist eine Klasse, die von SqliteRow erbt. SqliteRow Klasse ist eine Basisklasse für jedes Objekt, das ich von einer Abfrage zurückgegeben werden soll. Jede Spalte wird ein Attribut und wird in die fields Liste protokolliert. Funktion to_tuple verwendet wird, um das gesamte Objekt in eine Form, die für Abfragen zu ändern (einfach passiert das ganze Objekt und vergessen).

Um verschiedene Klassentypen dieser Funktion zu erhalten. Sie möchten gerne ein Factory-Objekt vornehmen müssen, dass Objekte auf der Grundlage der Liste der Felder erzeugen (zum Beispiel: dict mit {some_unique_value_made_of_fields: class})

Auf diese Weise erhalte ich eine einfache ORM.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top