Ich beginne eine neue Anwendung und suche mit einem ORM - insbesondere SQLAlchemy.Datenbank mit SQLAlchemy ORM effizient aktualisieren
Angenommen, ich habe eine Spalte 'foo' in meiner Datenbank und möchte sie erhöhen. In gerade SQLite ist dies relativ einfach:
db = sqlite3.connect('mydata.sqlitedb')
cur = db.cursor()
cur.execute('update table stuff set foo = foo + 1')
ich die SQLAlchemy SQL-Builder-Äquivalent herausgefunden:
engine = sqlalchemy.create_engine('sqlite:///mydata.sqlitedb')
md = sqlalchemy.MetaData(engine)
table = sqlalchemy.Table('stuff', md, autoload=True)
upd = table.update(values={table.c.foo:table.c.foo+1})
engine.execute(upd)
Dies ist etwas langsamer, aber es ist in ihm nicht viel.
Hier ist meine beste Vermutung für einen Ansatz SQLAlchemy ORM:
# snip definition of Stuff class made using declarative_base
# snip creation of session object
for c in session.query(Stuff):
c.foo = c.foo + 1
session.flush()
session.commit()
Dies tut das Richtige, aber es dauert knapp fünfzig mal so lang wie die beiden anderen Ansätze. Ich gehe davon aus, dass es alle Daten in den Speicher bringen muss, bevor es damit arbeiten kann.
Gibt es eine Möglichkeit, die effiziente SQL mit SQLAlchemy ORM zu generieren? Oder mit einem anderen Python ORM? Oder sollte ich einfach zurück zum Schreiben der SQL von Hand gehen?
Ok, ich nehme an die Antwort ist "das ist nicht etwas ORMs gut tun". Naja; Ich lebe und lerne. –
Es wurden einige Experimente mit verschiedenen ORMs durchgeführt und wie sie unter Last und Nötigung funktionieren. Einen Link nicht griffbereit, aber lesenswert. –
Ein weiteres Problem, das mit dem letzten (ORM) Beispiel existiert, ist, dass es nicht [atomar] ist (http://en.wikipedia.org/wiki/Atomic_operation). – Marian