2010-11-06 1 views
3

J'ai un certain nombre de classes qui sont mappées aux tables avec SQLAlchemy (non déclarative si cela compte). Étant donné que je souhaite que l'application soit testable à l'unité, toutes les interactions de session SQLAlchemy sont isolées dans une seule classe. Utilisation de l'application va quelque chose comme ceci:Possible d'ajouter un objet à la session SQLAlchemy sans session.add() explicite?

m = Model("mysql://localhost/mydb") 
s1 = Service("somename") 
m.session.add(s1) 
s1 is m.get_service("somename") # True 

Il est en fait plus rationalisé que cela, mais travailler avec moi ici.

Est-il possible de passer l'étape session.add()? En d'autres termes, si j'instancie une classe mappée, est-il possible qu'elle soit automatiquement ajoutée à la session SQLAlchemy active (le cas échéant)?

+0

duplication possible de [Comment ajouter automatiquement un objet SQLAlchemy à la session?] (Http://stackoverflow.com/questions/9873251/how-to-automatically-add-a-sqlalchemy-object-to-the- session) – user

Répondre

4

Dans SQLAlchemy, vous pouvez uniquement faire cela avec des tables en liant leurs métadonnées à un moteur. Cela ne fonctionne pas avec la partie ORM de SQLALchemy.

http://www.sqlalchemy.org/docs/core/schema.html?highlight=metadata#binding-metadata-to-an-engine-or-connection

Une approche de ce genre de chose est d'utiliser une session scope qui est accessible partout.

http://www.sqlalchemy.org/docs/orm/session.html?highlight=scoped%20session#sqlalchemy.orm.scoped_session

+0

Donc, "Non" est la réponse à ma question, je suppose. –

+0

Oui, je le crois. –

2

En fait, pas tout le temps. Si vous avez défini une relation entre les modèles enfant et parent ou une relation plusieurs-à-plusieurs, vous n'avez qu'à ajouter explicitement les objets parents. Les objets enfants sont ajoutés automatiquement lors de l'attribution de l'attribut parent, qui est toujours déjà dans db/session. Exemple:

a1 = Author(name='Pynchon') # out of session 
session.add(a1) # in session 
b1 = Book(name='Gravity`s Rainbow') # out of session 
b1.author = a1 #in session 
a2 = session.query(Author).filter(name='Eco').one() # in session 
b2 = Book(name='Baudolino') # out of session 
b2.author = a2 # in session 

Bien sûr, vous devez spécifier au préalable la relation 'auteur' entre les mappeurs.

Questions connexes