update tutorial tables query create python sqlalchemy declarative

python - tutorial - SQLAlchemy: ¿una mejor forma de actualizar con declarativo?



sqlalchemy tutorial (3)

Soy un novato de SQLAlchemy.

Digamos que tengo una tabla de usuario en modo declarativo:

class User(Base): __tablename__ = ''user'' id = Column(u''id'', Integer(), primary_key=True) name = Column(u''name'', String(50))

Cuando conozco la identificación del usuario sin objeto cargado en la sesión, actualizo a dicho usuario de la siguiente manera:

ex = update(User.__table__).where(User.id==123).values(name=u"Bob Marley") Session.execute(ex)

No me gusta usar User.__table__ , ¿debería dejar de preocuparme por eso?

¿Hay una mejor manera de hacer esto?

¡Gracias!


Aquí trabaja en el nivel de cláusula , no en el nivel de modelo / entidad / objeto. El nivel de cláusula es más bajo que los objetos asignados. Y sí, hay que hacer algo para convertir un término en otro.

También puede permanecer en el nivel de objeto y hacer:

session = Session() u = session.query(User).get(123) u.name = u"Bob Marley" session.commit()

pero será significativamente más lento ya que conduce a la construcción del objeto mapeado. Y no estoy seguro de que sea más legible.

En el ejemplo que le proporcioné, veo la solución más natural y "correcta". No me preocuparía la pequeña magia __table__ .


También hay alguna capacidad de actualización en el nivel ORM. No maneja ningún caso complicado, pero para el caso trivial de actualización de fila única (o actualización masiva) funciona bien. Incluso repasa los objetos ya cargados y aplica la actualización en ellos también. Puedes usarlo así:

session.query(User).filter_by(id=123).update({"name": u"Bob Marley"})


Funcionalidad similar está disponible a través del método update() en el objeto Table.

class User(Base): __tablename__ = ''user'' id = Column(''id'', Integer(), primary_key=True) name = Column(''name'', String(50)) stmt = User.__table__.update().where(User.id==5).values(name=''user #5'')

Para usar User.__table__ es como se hace en SQLAlchemy.