Ich beginne eine neue Anwendung und schaue auf die Verwendung eines ORM - insbesondere, SQLAlchemy.
Angenommen, ich habe eine Spalte "foo" in meiner Datenbank und möchte sie inkrementieren. In einfachem Sqlite ist das einfach:
db = sqlite3.connect('mydata.sqlitedb')
cur = db.cursor()
cur.execute('update table stuff set foo = foo + 1')
Ich habe das 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)
Es ist etwas langsamer, aber es ist nicht viel drin.
Hier ist meine beste Vermutung für eine SQLAlchemy ORM-Ansatz:
# 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()
Das ist zwar richtig, dauert aber knapp fünfzig Mal so lange wie die beiden anderen Ansätze. Ich vermute, das liegt daran, dass erst alle Daten in den Speicher gebracht werden müssen, bevor damit gearbeitet werden kann.
Gibt es eine Möglichkeit, die effiziente SQL mit SQLAlchemy's ORM zu generieren? Oder mit einer anderen Python ORM? Oder sollte ich die SQL einfach wieder von Hand schreiben?