2010-08-02 10 views
0

Lors de l'utilisation de SQLAlchemy, j'ajoute un objet à une session en utilisant session.add (objname), puis je le vide explicitement en utilisant session.flush ou j'autorise autoflush = True lors de la création du moteur lui-même.Dans Sqlalchemy, si j'ajoute un objet en utilisant session.add() et le vide, session.query() ne donne pas cet objet, pourquoi?

Maintenant dans la session, si vous voulez retourner cet objet via session.query (nom de classe) .all(), je ne peux pas le récupérer.

Pourquoi est-ce le cas? ou existe-t-il un moyen par lequel query() peut également récupérer des objets vidés.

Répondre

6

Je n'arrive pas à reproduire votre problème. Veuillez fournir un exemple de code que je peux exécuter pour le reproduire.

Code est ici qui fait ce que vous décrivez, mais se comporte comme on peut s'y attendre:

from sqlalchemy import Column, Integer, Unicode, create_engine 
from sqlalchemy.orm import create_session 
from sqlalchemy.ext.declarative import declarative_base 

engine = create_engine('sqlite://') 
Base = declarative_base(bind=engine) 

class User(Base): 
    __tablename__ = 'users' 
    id = Column(Integer, primary_key=True) 
    name = Column(Unicode(60)) 

Base.metadata.create_all() 

Après cette configuration, Ajouter un nouvel utilisateur:

s = create_session(autocommit=False, autoflush=False) 
u = User() 
u.name = u'Cheezo' 
s.add(u) 
s.flush() 

interroger Ensuite, retour:

>>> u2 = s.query(User).first() 
>>> print u2.name 
Cheezo 
>>> u2 is u 
True 
+0

Merci. Cela semble bien fonctionner pour moi aussi. Mais le problème auquel je suis confronté lorsque passer la session à travers plusieurs niveaux de fonctions. donc si A() passe la session à B(), je peux accéder à l'objet non-validé. Mais si A() -> B() -> C() (en passant la session tout le long) et j'essaie d'accéder à cet objet en C. Il se plaint que l'objet n'existe pas. Que pourrais-je manquer? – Cheezo

+2

@Cheezo: Je ne sais pas. Ça devrait marcher. Peut-être que vous devriez fournir un petit script qui reproduit le problème - Ou peut-être juste modifier mon script d'une manière qui reproduit votre problème. J'ai essayé d'ajouter plusieurs niveaux de fonctions et tout fonctionne bien. Donc, comme je l'ai dit dans la première phrase de ma réponse ** S'il vous plaît fournir un exemple de code que je peux exécuter pour le reproduire **. – nosklo

+0

J'étais capable de résoudre le problème. Le problème est dû au fait que j'étais en fait en train d'utiliser différents objets de session. J'ai ajouté l'objet à une session mais j'ai essayé de le récupérer dans une autre session, ce qui causait le problème. Merci pour votre aide nosklo! – Cheezo