Estou iniciando um novo aplicativo e procurando usar um ORM - em particular, SQLAlchemy.
Digamos que tenho uma coluna 'foo' em meu banco de dados e desejo incrementá-la. No sqlite direto, isso é fácil:
db = sqlite3.connect('mydata.sqlitedb')
cur = db.cursor()
cur.execute('update table stuff set foo = foo + 1')
Eu descobri o equivalente do 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)
Isso é um pouco mais lento, mas não há muito nele.
Aqui está meu melhor palpite para uma abordagem 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()
Isso faz a coisa certa, mas leva pouco menos de cinquenta vezes mais do que as outras duas se aproximam. Presumo que seja porque ele tem que trazer todos os dados para a memória antes de poder trabalhar com eles.
Existe alguma maneira de gerar o SQL eficiente usando ORM do SQLAlchemy? Ou usando qualquer outro python ORM? Ou devo simplesmente voltar a escrever o SQL manualmente?