2010-08-12 13 views
35

Qual è il modo migliore per creare una relazione uno a uno in SQLAlchemy utilizzando dichiarativo?sqlalchemy: rapporto uno a uno con dichiarativo

Ho due tabelle, foo e bar, e voglio foo.bar_id da collegare a bar. Il problema è che questa è una relazione one-to-one a senso unico. bar non deve sapere nulla di foo. Per ogni pippo, ci sarà uno e solo uno bar.

Idealmente, dopo aver selezionato una foo, avrei potuto fare qualcosa di simile:

myfoo.bar.whatever = 5 

Qual è il modo migliore per ottenere questo risultato utilizzando dichiarativa?

risposta

28

Se volete una vera relazione uno-a-uno, si hanno anche per utilizzare la "uselist = False" nella definizione del rapporto.

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

Questo non è esattamente corretto, perché la parola chiave '' uselist'' non ha alcun impatto se l'FK del join si trova nella stessa classe della definizione della relazione. Vedere la [risposta di chadwick.boulay] (http://stackoverflow.com/a/9611874/851737) per la soluzione corretta. – schlamar

2

Si scopre che in realtà è abbastanza semplice. Nel modello Foo:

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

La documentazione per 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')) 

O

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

penso che se si tratta di un vero e relazione uno a uno dovremmo aggiungere un vincolo di unicità a chiave esterna in modo da un'altra genitore non può avere un altro figlio genitore !! In questo modo:

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) 
Problemi correlati