2016-12-02 2 views
5

Pour les versions plus anciennes de la pyramide la configuration pour la session sqlalchemy a été fait avec scooped_session semblable à cePyramide avec SQLAlchemy: session de base de données scope ou non scope

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

Cependant, je vois que des tutoriels plus récents et la pyramide docs ' promeut 'sqlalchemy sans threadlocals où la DBSession est attachée à l'objet request.

Est-ce que le 'vieux' mode est cassé et quel est l'avantage du non threadlocals?

Répondre

8

J'ai mené cette transition avec l'aide de plusieurs autres contributeurs qui avaient [1] parlé de certains avantages. Il s'agit essentiellement de suivre la philosophie de la pyramide, qui consiste à permettre l'écriture d'applications ne nécessitant pas de variables globales. Ceci est très important lors de l'écriture de code réutilisable et composable. Il rend les dépendances de votre code (api surface) claires, au lieu d'avoir des fonctions aléatoires dépendantes de votre base de données, malgré leurs signatures de fonctions/variables membres n'exposant pas ces dépendances. Cela facilite également le test du code car vous n'avez pas à vous soucier autant des variables threadlocal. Avec les globals vous devez rechercher quels modules peuvent contenir des références et les patcher pour utiliser le nouvel objet. Sans globals, vous passez simplement les objets que vous voulez utiliser et le code les utilise, comme n'importe quel autre paramètre pour une fonction ou un état sur un objet.

Beaucoup de gens se plaignent de devoir passer leur base de données à des tonnes de fonctions. Ceci est une odeur et signifie simplement que vous ne concevez pas bien vos apis. Plusieurs fois vous pouvez structurer les choses comme un objet créé une fois par demande et stocke le handle comme quelque chose comme self.dbsession, et chaque méthode sur l'objet a maintenant accès à celui-ci.

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

+0

Ce blog fait que la question, est logique - merci – silviud