2011-11-27 4 views
1

Newish to SQLAlchemy (donc ma terminologie est peut-être un peu éteinte). Je veux créer un objet de base de données dans le constructeur d'un autre, mais le problème est que je ne peux pas ajouter cet objet à la session, donc j'obtiens une erreur.SQLAlchemy - crée une instance dans une autre instance __init__

Mon schéma ressemble un peu à ce qui suit:

class Tag(Base): 
    __tablename__ = 'tag' 

    id = Column(Integer, Sequence('tag_id_seq'), primary_key=True, nullable=False) 
    type = Column(String(1), nullable=False) 
    name = Column(String(255), unique=True, nullable=False) 

    def __init__(self, type, name): 
     self.type=type 
     self.name=name 

    def __repr__(self): 
     return "<Tag('%s')>" % (self.id) 


class Venue: 
    __tablename__ = 'venue' 

    tag_id = Column(Integer) 
    tag_type = Column(String(1), nullable=False) 
    location = Column(String(255), nullable=False) 

    tag = ForeignKeyConstraint(
      (tag_id, tag_type), 
      (Tag.id, Tag.type), 
      onupdate='RESTRICT', 
      ondelete='RESTRICT', 
      ) 

    def __init__(self,name,location): 
     self.tag = Tag('V',name) 
     self.location = location 

Quand je fais ce qui suit:

session.add(Venue("Santa's Cafe","South Pole")) 

Je reçois une erreur:

UnmappedInstanceError: Class '__builtin__.instance' is not mapped 

Je suppose que cela est dû au fait l'objet Tag créé dans le constructeur de Venue n'est pas ajouté à la session. Ma question est comment/quand je fais cela. (Je préfèrerais vraiment créer cet objet Tag dans le constructeur si possible). Je pense que je pourrais le faire avec une scoped_session mais cela semble être une très mauvaise solution.

Merci

+3

doit pas Venue hériter de base? –

+0

Oui. (parmi d'autres problèmes!) – DaedalusFall

Répondre

2
  1. Hériter Venue de Base. Sinon, Venue ne sera pas mappé.
  2. Déplacez ForeignKeyConstraint vers __table_args__.
  3. Remplacez la propriété tag actuellement vide de signification par relationship à Tag. La valeur par défaut du paramètre cascade à relationship contient la règle 'save-update' qui ajoutera un nouvel objet référencé à la même session que le parent.

De documentation:

save-update - cascade the Session.add() operation. This cascade applies both to future and past calls to add() , meaning new items added to a collection or scalar relationship get placed into the same session as that of the parent, and also applies to items which have been removed from this relationship but are still part of unflushed history.

+0

Merci, bonne explication là-bas. Je m'habituerai à la façon dont sqlalchemy me dit ce qui ne va pas. – DaedalusFall

Questions connexes