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?
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)
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)
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)
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)