sqlalchemy:与declarati的一对一关系

2024-04-24 18:54:26 发布

您现在位置:Python中文网/ 问答频道 /正文

使用声明式在SQLAlchemy中创建一对一关系的最佳方法是什么?

我有两个表,foobar,我希望foo.bar_id链接到bar。关键是这是一种单向的一对一关系。bar不能知道foo的任何信息。对于每个foo,只有一个bar

理想情况下,在选择foo之后,我可以这样做:

myfoo.bar.whatever = 5 

使用声明性语句来实现这一点的最佳方法是什么?


Tags: 方法信息id声明foosqlalchemy关系链接
3条回答

文档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'))

或者

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)

我认为如果这是一个真正的一对一的关系,我们应该给外键添加一个唯一性约束,这样另一个父节点就不能有另一个父节点!!像这样:

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)

如果你想要一个真正的一对一关系,你还必须在你的关系定义中使用“uselist=False”。

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

相关问题 更多 >