Estoy iniciando una nueva aplicación y estoy pensando en usar un ORM, en particular, SQLAlchemy.
Digamos que tengo una columna 'foo' en mi base de datos y quiero incrementarla. En sqlite simple, esto es fácil:
db = sqlite3.connect('mydata.sqlitedb')
cur = db.cursor()
cur.execute('update table stuff set foo = foo + 1')
Descubrí el equivalente del constructor SQL de 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)
Esto es un poco más lento, pero no tiene mucho contenido.
Aquí está mi mejor suposición para un enfoque ORM de 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()
Esto hace lo correcto, pero tarda menos de cincuenta veces más que los otros dos enfoques. Supongo que es porque tiene que traer todos los datos a la memoria antes de que pueda trabajar con ellos.
¿Hay alguna forma de generar el SQL eficiente usando el ORM de SQLAlchemy? ¿O usando cualquier otro ORM de Python? ¿O debería volver a escribir el SQL a mano?