Sto avviando una nuova applicazione e sto cercando di utilizzare un ORM, in particolare SQLAlchemy.
Diciamo che ho una colonna "pippo" nel mio database e voglio incrementarla. In straight sqlite, questo è facile:
db = sqlite3.connect('mydata.sqlitedb')
cur = db.cursor()
cur.execute('update table stuff set foo = foo + 1')
Ho capito l'equivalente del generatore SQL di SQLAlchemy:
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)
Questo è leggermente più lento, ma non contiene molto.
Ecco la mia ipotesi migliore per un approccio ORM SQLAlchemy:
# 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()
Questo fa la cosa giusta, ma ci vuole poco meno di cinquanta volte il tempo che gli altri due si avvicinano. Presumo sia perché deve portare tutti i dati in memoria prima di poter lavorare con esso.
Esiste un modo per generare l'SQL efficiente utilizzando ORM di SQLAlchemy? O usi un altro ORM python? O dovrei semplicemente tornare a scrivere l'SQL a mano?