Я запускаю новое приложение и ищу возможность использования 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 вручную?