sql >> Base de Datos >  >> RDS >> Mysql

Acerca de la actualización de objetos en la sesión de sqlalchemy

Las sesiones están diseñadas para funcionar así . Los atributos del objeto en la sesión B mantendrán lo que tenían cuando se consultó por primera vez en la sesión B. Además, SQLAlchemy no intentará actualizar automáticamente los objetos en otras sesiones cuando cambien, ni creo que sea prudente intentar crear algo así.

Debería pensar activamente en la vida útil de cada sesión como una sola transacción en la base de datos. Cómo y cuándo las sesiones deben lidiar con el hecho de que sus objetos pueden estar obsoletos no es un problema técnico que pueda resolverse mediante un algoritmo integrado en SQLAlchemy (o cualquier extensión de SQLAlchemy):es un problema de "negocio" cuya solución debe resolver. determine y codifique usted mismo. La respuesta "correcta" podría ser decir que esto no es un problema:la lógica que ocurre con la sesión B podría ser válida si utilizó los datos en el momento en que se inició la sesión B. Su "problema" podría no ser realmente un problema. Los documentos en realidad tienen un toda la sección sobre cuándo usar sesiones , pero da una respuesta bastante sombría si espera una solución única para todos...

Dicho esto, hay algunas cosas que puedes hacer para cambiar la forma en que funciona la situación:

Primero, puede reducir el tiempo que su sesión permanece abierta. La sesión B está consultando el objeto, luego está haciendo algo con ese objeto (en la misma sesión) que desea que los atributos estén actualizados. Una solución es realizar esta segunda operación en una sesión separada.

Otra es usar los métodos expire/refresh, como los docs mostrar ...

# immediately re-load attributes on obj1, obj2
session.refresh(obj1)
session.refresh(obj2)

# expire objects obj1, obj2, attributes will be reloaded
# on the next access:
session.expire(obj1)
session.expire(obj2)

Puedes usar session.refresh() para obtener inmediatamente una versión actualizada del objeto, incluso si la sesión ya consultó el objeto anteriormente.