Ich starte eine neue Anwendung und möchte ein ORM verwenden - insbesondere SQLAlchemy.
Angenommen, ich habe eine Spalte 'foo' in meiner Datenbank und möchte sie erhöhen. In Straight SQLite ist dies 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)
Das ist etwas langsamer, aber es ist nicht viel drin.
Hier ist meine beste Vermutung für einen 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()
Dies macht das Richtige, aber es dauert knapp fünfzig Mal so lange wie die beiden anderen Ansätze. Ich nehme an, das liegt daran, dass alle Daten gespeichert werden müssen, bevor sie damit arbeiten können.
Gibt es eine Möglichkeit, das effiziente SQL mit dem ORM von SQLAlchemy zu generieren? Oder mit einem anderen Python-ORM? Oder sollte ich einfach wieder das SQL von Hand schreiben?