Я запускаю нову програму і переглядаю використання ORM - зокрема, SQLAlchemy.
Скажіть, у мене в базі даних стовпчик «foo», і я хочу збільшити його. У прямому sqlite це легко:
db = sqlite3.connect('mydata.sqlitedb')
cur = db.cursor()
cur.execute('update table stuff set foo = foo + 1')
Я з'ясував еквівалент 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)
Це трохи повільніше, але в ньому мало що.
Ось моя найкраща здогадка щодо підходу 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()
Це робиться правильно, але це забирає трохи менше п'ятдесяти разів, ніж інші два підходи. Я припускаю, що це тому, що він повинен принести всі дані в пам'ять, перш ніж він може працювати з ними.
Чи є спосіб створити ефективний SQL за допомогою ORM SQLAlchemy? Або використовуєте будь-який інший ORM python? Або мені просто повернутися до написання SQL вручну?