Rozpoczynam nową aplikację i patrzę na użycie ORM - w szczególności SQLAlchemy.
Powiedzmy, że mam kolumnę „foo” w mojej bazie danych i chcę ją zwiększyć. W prostym sqlite jest to łatwe:
db = sqlite3.connect('mydata.sqlitedb')
cur = db.cursor()
cur.execute('update table stuff set foo = foo + 1')
Znalazłem odpowiednik 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)
To jest nieco wolniejsze, ale nie ma w nim dużo.
Oto moje najlepsze przypuszczenie dotyczące podejścia 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()
Robi to dobrze, ale trwa to niecałe pięćdziesiąt razy dłużej, niż zbliżają się pozostałe dwa. Przypuszczam, że dzieje się tak dlatego, że musi przenieść wszystkie dane do pamięci, zanim będzie mógł z nimi pracować.
Czy istnieje sposób na wygenerowanie wydajnego kodu SQL przy użyciu ORM SQLAlchemy? Lub używasz innego ORM Pythona? A może powinienem po prostu wrócić do ręcznego pisania SQL?