2010-08-12 22 views
35

¿Cuál es la mejor manera de crear una relación uno a uno en SQLAlchemy usando declarativo?sqlalchemy: relación uno a uno con declaración

Tengo dos tablas, foo y bar, y quiero foo.bar_id para vincular a bar. El problema es que esta es una relación uno-a-uno de ida. bar no debe saber nada sobre foo. Para cada foo, habrá uno y solo uno bar.

Idealmente, después de seleccionar un foo, yo podría hacer algo como esto:

myfoo.bar.whatever = 5 

Cuál es la mejor manera de lograr esto usando declarativa?

Respuesta

28

Si desea una verdadera relación uno-a-uno, también hay que utilizar el "uselist = False" en la definición de relación.

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

Esto no es exactamente correcto, porque la palabra clave '' uselist'' no tiene ningún impacto si el FK de la unión está en la misma clase que la definición de la relación. Consulte la [respuesta de chadwick.boulay] (http://stackoverflow.com/a/9611874/851737) para obtener la solución correcta. – schlamar

2

Resulta que esto es realmente bastante fácil. En su modelo de Foo:

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

La documentación 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')) 

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

creo que si se trata de una verdadera relación uno a uno que habría que añadir una restricción de unicidad de la clave externa por lo que otro ¡el padre no puede tener otro hijo principal! De esta manera:

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) 
Cuestiones relacionadas