Python sqlalchemy:与声明性

Python sqlalchemy:与声明性,python,sqlalchemy,Python,Sqlalchemy,在SQLAlchemy中,使用声明性语句创建一对一关系的最佳方法是什么 我有两个表,foo和bar,我希望foo.bar\u id链接到bar。问题是这是一种单向的一对一关系条形图不得了解任何有关foo的信息。对于每个foo,都将有且只有一个bar 理想情况下,在选择一个foo之后,我可以这样做: myfoo.bar.whatever = 5 使用声明式实现这一点的最佳方法是什么?事实证明,这其实非常简单。在您的Foo模型中: bar_id = Column(Integer, Foreign

在SQLAlchemy中,使用声明性语句创建一对一关系的最佳方法是什么

我有两个表,
foo
bar
,我希望
foo.bar\u id
链接到
bar
。问题是这是一种单向的一对一关系<代码>条形图不得了解任何有关
foo
的信息。对于每个foo,都将有且只有一个
bar

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

myfoo.bar.whatever = 5 

使用声明式实现这一点的最佳方法是什么?

事实证明,这其实非常简单。在您的Foo模型中:

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

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

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


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

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)

这并不完全正确,因为如果联接的FK与关系定义在同一个类中,则
uselist
关键字没有影响。有关正确的解决方案,请参阅。
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)