Я запускаю новое приложение и смотрю на использование ORM - в частности, SQLAlchemy.
Скажем, у меня есть столбец "foo" в моей базе данных, и я хочу увеличить его. В прямом sqlite это легко:
db = sqlite3.connect('mydata.sqlitedb')
cur = db.cursor()
cur.execute('update table stuff set foo = foo + 1')
Я вычислил эквивалент SQL-Builder 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)
Это немного медленнее, но там не так много.
Вот мое лучшее предположение для 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()
Это правильно, но требуется чуть меньше пятидесяти раз, пока другие два подхода. Я предполагаю, что, поскольку он должен довести все данные до памяти, прежде чем он сможет работать с ним.
Есть ли способ генерировать эффективный SQL, используя ORM SQLAlchemy? Или с помощью любого другого ORM питона? Или я должен просто вернуться к написанию SQL вручную?