Je démarre une nouvelle application et cherche à utiliser un ORM - en particulier, SQLAlchemy.
Disons que j'ai une colonne «foo» dans ma base de données et que je souhaite l'incrémenter. En simple sqlite, c'est facile:
db = sqlite3.connect('mydata.sqlitedb')
cur = db.cursor()
cur.execute('update table stuff set foo = foo + 1')
J'ai trouvé l'équivalent SQLAlchemy SQL-builder:
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)
C'est légèrement plus lent, mais il n'y a pas grand-chose dedans.
Voici ma meilleure estimation pour une approche 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()
Cela fait la bonne chose, mais cela prend un peu moins de cinquante fois plus longtemps que les deux autres approches. Je suppose que c'est parce qu'il doit mettre toutes les données en mémoire avant de pouvoir fonctionner avec.
Existe-t-il un moyen de générer le SQL efficace en utilisant l'ORM de SQLAlchemy? Ou en utilisant un autre ORM python? Ou devrais-je simplement revenir à l'écriture manuelle du SQL?