Estoy comenzando una nueva aplicación y estoy mirando usando un ORM, en particular, SQLAlchemy.Actualización eficiente de la base de datos usando SQLAlchemy ORM
Digamos que tengo una columna 'foo' en mi base de datos y quiero incrementarla. En sqlite recta, esto es fácil:
db = sqlite3.connect('mydata.sqlitedb')
cur = db.cursor()
cur.execute('update table stuff set foo = foo + 1')
me di cuenta de SQL-constructor SQLAlchemy equivalente:
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 hay mucho en ella.
Aquí es mi mejor conjetura de un enfoque 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()
Esto hace lo correcto, pero tiene poco menos de cincuenta veces más largo que los otros dos enfoques. Supongo que es porque tiene que traer todos los datos a la memoria antes de que pueda funcionar con ellos.
¿Hay alguna manera de generar el SQL eficiente utilizando SQLAlchemy's ORM? ¿O usando cualquier otro ORM de python? ¿O debería volver a escribir el SQL a mano?
Ok, asumo que la respuesta es "esto no es algo que los ORM hacen bien". Oh bien; Yo vivo y aprendo –
Se han realizado algunos experimentos en diferentes ORM y cómo funcionan bajo carga y coacción. No tiene un enlace a mano, pero vale la pena leerlo. –
Otro problema que existe con el último ejemplo (ORM) es que no es [atómico] (http://en.wikipedia.org/wiki/Atomic_operation). – Marian