Sessions are designed to work like this. Atrybuty obiektu w Sesji B MOGĄ zachować to, co miał przy pierwszym zapytaniu w Sesji B. Dodatkowo, SQLAlchemy nie będzie próbowało automatycznie odświeżać obiektów w innych sesjach, kiedy się zmienią, ani nie wydaje mi się, że mądrze byłoby spróbować stworzyć coś lubię to.
powinny być aktywnie myśleć o żywotności każdej sesji jako pojedynczej transakcji w bazie danych. Jak i kiedy sesje muszą radzić sobie z tym, że ich obiekty mogą być nieaktualne, nie jest problemem technicznym, który można rozwiązać za pomocą algorytmu wbudowanego w SQLAlchemy (lub dowolnego rozszerzenia dla SQLAlchemy): jest to problem "biznesowy", którego rozwiązanie należy ustalasz i kodujesz siebie. "Prawidłową" odpowiedzią może być stwierdzenie, że to nie jest problem: logika występująca w sesji B może być ważna, jeśli użyła danych w czasie rozpoczęcia sesji B. Twój "problem" może nie być problemem. Docs faktycznie mają entire section on when to use sessions, ale daje dość ponurą odpowiedź, jeśli mają nadzieję na jednego uniwersalnego rozwiązania wszystkich ...
sesja jest zwykle zbudowana na początku operacji logicznej gdzie potencjalnie przewidywany jest dostęp do bazy danych.
Sesja, gdy jest używana do rozmowy z bazą danych, rozpoczyna transakcję bazy danych zaraz po rozpoczęciu komunikacji. Zakładając flagę AUTOCOMMIT pozostawia się w zalecanym zalega z False, ta transakcja pozostaje w toku, dopóki sesja jest przywracana, popełnione, czy zamknięte. Sesja rozpocznie nową transakcję, jeśli ponownie zostanie użyta , po zakończeniu poprzedniej transakcji; z wynika stąd, że Sesja może mieć długość okresu ważności dla wielu transakcji, ale tylko jedna na raz. Te dwa pojęcia traktujemy jako zakres transakcji i zakres sesji.
Konsekwencją jest to, że SQLAlchemy ORM jest zachęcanie dewelopera do ustanowienia tych dwóch zakresów w swoim wniosku, tym nie tylko wtedy, gdy zakresy zaczynają się i kończą, ale także przestrzeń z tych zakresów, na przykład należy pojedyncza instancja Session być lokalne do przepływu wykonanie wewnątrz funkcji lub metody, powinien to być obiekt globalny wykorzystywane przez całej aplikacji, lub gdzieś pomiędzy te dwa.
Ciężar nałożony na dewelopera w celu ustalenia tego zakresu to jeden obszar , w którym SQLAlchemy ORM musi mieć zdecydowaną opinię na temat tego, jak należy korzystać z bazy danych w wersji . Wzorzec jednostki pracy to konkretnie jeden z akumulujących się zmian w czasie i okresowe ich opróżnianie, utrzymywanie stanu w pamięci w synchronizacji z tym, co jest znane z lokalnej transakcji.Ten wzór działa tylko wtedy, gdy ważne są zakresy transakcji.
Mimo to, istnieje kilka rzeczy, które można zrobić, aby zmienić sposób działa sytuacja:
pierwsze, można zmniejszyć, jak długo sesja pozostaje otwarta. Sesja B wysyła zapytanie do obiektu, a następnie robisz coś z tym obiektem (w tej samej sesji), że chcesz mieć atrybuty aktualne. Jednym rozwiązaniem jest wykonanie tej drugiej operacji w oddzielnej sesji.
Innym jest użycie wygasają/metod odświeżania, jak docs show ...
# 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)
Można użyć session.refresh()
aby natychmiast uzyskać up-to-date wersji obiektu, nawet jeśli już sesja wcześniej zapytał obiekt.
http://stackoverflow.com/a/18684124/1309352 –
To może pomóc także : http://stackoverflow.com/a/25694346/134904 – kolypto