2013-10-02 10 views
10

Cóż, mam do czynienia z wątpliwości SQLAlchemy i obiektów orzeźwiający!O orzeźwiające obiektów w sesji sqlalchemy

Jestem w sytuacji, w której mam dwie sesje, i ten sam obiekt został zapytany w obu sesjach! ... Dla niektórych szczególnych rzeczy nie mogę zamknąć jednej z sesji. Zmodyfikowałem obiekt i zatwierdziłem zmiany w sesji A, ale w sesji B atrybuty są początkowe! bez zmian! ..

... Więc będę realizować jakiś system powiadamiania komunikowania zmian lub nie ma wbudowanego sposób to zrobić w SQLAlchemy ??

+1

http://stackoverflow.com/a/18684124/1309352 –

+0

To może pomóc także : http://stackoverflow.com/a/25694346/134904 – kolypto

Odpowiedz

17

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.

+0

Thx! Chcę powiedzieć, że przeczytałem pełną dokumentację sesji. Ale nawet po zrobieniu tego, mam pewne problemy z ustaleniem, gdzie rozpocząć sesję i gdzie zakończyć to w moim kodzie aplikacji, a to nie jest w dokumentacji haha. –

+0

Czas i sposób korzystania z sesji będzie różny dla różnych aplikacji. Nie ma jednego rozwiązania, które pasowałoby do wszystkich, i opisanie, w jaki sposób można by określić proces, który może być całą książką. Nie bądź więc zły, że nie masz pewności, jak to zrobić, ponieważ nie jest to prosty problem. –

+0

cóż, mówiąc to, czuję się bardziej swobodnie w tworzeniu przepływu pracy, który zaspokaja moje potrzeby i nie próbuję znaleźć wzoru, w którym nie może istnieć! –

Powiązane problemy