Cómo boost un contador en SQLAlchemy

Supongamos que tengo tags tabla que tienen un count campos que indica cuántos items se han etiquetado con la etiqueta dada.

¿Cómo puedo boost este contador en SQLAlchemy después de agregar un nuevo elemento con una etiqueta existente?

Con SQL plano haría lo siguiente:

 INSERT INTO `items` VALUES (...) UPDATE `tags` SET count=count+1 WHERE tag_id=5 

¿Pero cómo expreso count=count+1 en SQLAlchemy?

Gracias, Boda Cydo.

Si tienes algo como:

 mytable = Table('mytable', db.metadata, Column('id', db.Integer, primary_key=True), Column('counter', db.Integer) ) 

Puedes incrementar campos como este:

 m = mytable.query.first() m.counter = mytable.c.counter + 1 

O, si tiene algunos modelos asignados, puede escribir alternativamente:

 m = Model.query.first() m.counter = Model.counter + 1 

Ambas versiones devolverán la statement sql que ha solicitado. Pero si no incluye la columna y simplemente escribe m.counter += 1 , entonces el nuevo valor se calcularía en Python (y es probable que ocurran las condiciones de la raza). Por lo tanto, siempre incluya una columna como se muestra en los dos ejemplos anteriores en tales consultas de contador.

Saludos,
Christoph

Si está utilizando la capa SQL, puede usar expresiones SQL arbitrarias en la statement de actualización:

 conn.execute(tags.update(tags.c.tag_id == 5).values(count=tags.c.count + 1)) 

El objeto ORM Query también tiene un método de actualización:

 session.query(Tag).filter_by(tag_id=5).update({'count': Tag.count + 1}) 

La versión de ORM es lo suficientemente inteligente como para actualizar el atributo de conteo en el objeto en sí mismo si está en la sesión.