2016-12-02 39 views
5

Dla starszych wersjach piramidy Układ do sesji sqlalchemy została wykonana z scooped_session podobny do tegoPiramida z SQLAlchemy: lunetą lub non-lunetą sesja bazie

DBSession = scoped_session(
    sessionmaker(
     autoflush=True, 
     expire_on_commit=False, 
     extension=zope.sqlalchemy.ZopeTransactionExtension() 
    ) 

Jednak widzę, że nowe samouczki oraz piramida docs ' promuje "sqlalchemy bez żadnych wątków, w których DBSession jest dołączona do obiektu żądania.

Czy "stary" sposób został złamany i jaka jest zaleta braku wątków?

Odpowiedz

8

Wprowadziłem tę zmianę z pomocą kilku innych autorów, którzy blogowali [1] na temat pewnych zalet. Zasadniczo sprowadza się do przestrzegania filozofii piramidy polegającej na umożliwieniu pisania aplikacji, które nie wymagają żadnych zmiennych globalnych. Jest to bardzo ważne przy pisaniu wielokrotnego użytku, składanego kodu. Sprawia, że ​​zależności twojego kodu (powierzchnia api) są jasne, zamiast funkcji losowych zależnych od twojej bazy danych, mimo że ich sygnatury funkcji/zmienne składowe nie ujawniają tych zależności. Ułatwia to również testowanie kodu, ponieważ nie musisz martwić się o zmienne typu threadlocal. W przypadku globali należy wyśledzić, które moduły mogą przechowywać odniesienia do nich i załączyć je, aby korzystać z nowego obiektu. Bez globali po prostu przekazujesz obiekty, których chcesz użyć, a kod je używa, tak jak każdy inny parametr funkcji lub stanu obiektu.

Wiele osób narzeka na konieczność przekazania ich bazy danych do wielu funkcji. To zapach i po prostu oznacza, że ​​nie projektujesz swoich apisa dobrze. Wiele razy można budować rzeczy jako obiekt, który jest tworzony raz na żądanie i przechowuje uchwyt jako coś takiego jak self.dbsession, a każda metoda na obiekcie ma teraz do niego dostęp.

[1] https://metaclassical.com/testing-pyramid-apps-without-a-scoped-session/

+0

Ten wpis na blogu spowodował pytanie, ma sens - dzięki – silviud