Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Sobre como atualizar objetos na sessão sqlalchemy


As sessões são projetadas para funcionar assim . Os atributos do objeto na Sessão B manterão o que ele tinha quando consultado pela primeira vez na Sessão B. Além disso, o SQLAlchemy não tentará atualizar automaticamente os objetos em outras sessões quando eles mudarem, nem acho que seria sensato tentar criar algo assim.

Você deve pensar ativamente na vida útil de cada sessão como uma única transação no banco de dados. Como e quando as sessões precisam lidar com o fato de que seus objetos podem estar obsoletos não é um problema técnico que pode ser resolvido por um algoritmo embutido no SQLAlchemy (ou qualquer extensão do SQLAlchemy):é um problema de "negócios" cuja solução você deve determine e codifique você mesmo. A resposta "correta" pode ser dizer que isso não é um problema:a lógica que ocorre com a Sessão B poderia ser válida se ela usasse os dados no momento em que a Sessão B foi iniciada. Seu "problema" pode não ser realmente um problema. Na verdade, os documentos têm um seção inteira sobre quando usar sessões , mas dá uma resposta bastante sombria se você espera uma solução única para todos ...

Dito isto, há algumas coisas que você pode fazer para mudar a forma como a situação funciona:

Primeiro, você pode reduzir o tempo que sua sessão permanece aberta. A sessão B está consultando o objeto, depois você está fazendo algo com esse objeto (na mesma sessão) que deseja que os atributos estejam atualizados. Uma solução é fazer essa segunda operação em uma sessão separada.

Outra é usar os métodos expire/refresh, como os 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)

Você pode usar session.refresh() para obter imediatamente uma versão atualizada do objeto, mesmo que a sessão já tenha consultado o objeto anteriormente.