2010-08-12 10 views
35

Quelle est la meilleure façon de créer une relation un-à-un dans SQLAlchemy en utilisant déclarative?sqlalchemy: relation un-à-un avec déclarative

J'ai deux tables, foo et bar, et je veux foo.bar_id de lier à bar. Le hic, c'est qu'il s'agit d'une relation one-to-one à sens unique. bar ne doit rien savoir sur foo. Pour chaque truc, il y en aura un et un seul bar.

Idéalement, après avoir sélectionné un foo, je pourrais faire quelque chose comme ceci:

myfoo.bar.whatever = 5 

Quelle est la meilleure façon d'y parvenir en utilisant déclarative?

Répondre

28

Si vous voulez un vrai-à-un, vous devez également utiliser la fonction « uselist = False » dans la définition de votre relation.

bar_id = Column(Integer, ForeignKey(Bar.id)) 
bar = relationship(Bar, uselist=False) 
+6

Ce n'est pas tout à fait exact, car le mot-clé '' uselist'' n'a aucun impact si le FK de la jointure est dans la même classe que la définition de la relation. Voir la [réponse de chadwick.boulay] (http://stackoverflow.com/a/9611874/851737) pour la solution correcte. – schlamar

2

Il s'avère que c'est plutôt facile. Dans votre modèle Foo:

bar_id = Column(Integer, ForeignKey(Bar.id)) 
bar = relationship(Bar) 
81

La documentation de 0,7 explains this nicely:

class Parent(Base): 
    __tablename__ = 'parent' 
    id = Column(Integer, primary_key=True) 
    child = relationship("Child", uselist=False, backref="parent") 

class Child(Base): 
    __tablename__ = 'child' 
    id = Column(Integer, primary_key=True) 
    parent_id = Column(Integer, ForeignKey('parent.id')) 

OU

class Parent(Base): 
    __tablename__ = 'parent' 
    id = Column(Integer, primary_key=True) 
    child_id = Column(Integer, ForeignKey('child.id')) 
    child = relationship("Child", backref=backref("parent", uselist=False)) 

class Child(Base): 
    __tablename__ = 'child' 
    id = Column(Integer, primary_key=True) 
3

Je pense que si elle est un véritable relation un à un, il faut ajouter une contrainte d'unicité à la clé étrangère si une autre le parent ne peut pas avoir d'autre parent parent !! Comme ceci:

class Parent(Base): 
    __tablename__ = 'parent' 
    id = Column(Integer, primary_key=True) 
    child_id = Column(Integer, ForeignKey('child.id'), unique=True) 
    child = relationship("Child", backref=backref("parent", uselist=False)) 

class Child(Base): 
    __tablename__ = 'child' 
    id = Column(Integer, primary_key=True) 
Questions connexes