web-dev-qa-db-fra.com

sqlalchemy: relation individuelle avec déclaratif

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

J'ai deux tables, foo et bar, et je veux foo.bar_id pour créer un lien vers bar. Le hic, c'est qu'il s'agit d'une relation à sens unique. bar ne doit rien savoir de foo. Pour chaque foo, il y aura un et un seul bar.

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

myfoo.bar.whatever = 5 

Quelle est la meilleure façon d'accomplir cela en utilisant déclarative?

47
carl

Si vous voulez une vraie relation un-à-un, vous devez également utiliser la "liste d'utilisateurs = Faux" dans votre définition de relation.

bar_id = Column(Integer, ForeignKey(Bar.id))
bar = relationship(Bar, uselist=False)
35
Brett Bim

La documentation explique cela joliment :

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

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

OR

class Parent(Base):
    __table= '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):
    __table= 'child'
    id = Column(Integer, primary_key=True)
106
chadwick.boulay

Je pense que si c'est vraiment une relation un à un, nous devrions ajouter une contrainte d'unicité à la clé étrangère pour qu'un autre parent ne puisse pas avoir un autre parent enfant !! Comme ça:

class Parent(Base):
    __table= '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):
    __table= 'child'
    id = Column(Integer, primary_key=True)
4
Hamid FzM

Il s'avère que c'est en fait assez facile. Dans votre modèle Foo:

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