SQLAlchemy:一对一关系对象创建问题

时间:2016-01-02 03:52:35

标签: python sqlite sqlalchemy relationship one-to-one

我是SQLAlchemy的新手,我试图运行其文档中提供的示例Basic Relationship Patterns - One to One Relationship。但是当我尝试实例化Parent类时,我遇到了麻烦。

基本上,我所拥有的是:

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

class Child(Base):
    __tablename__ = 'child'
    id = Column(Integer, primary_key=True)
    parent_id = Column(Integer, ForeignKey('parent.id'))
    parent = relationship("Child", back_populates="child")

p1 = Parent()

这些表格是由.tables在sqlite>列出的。提示,但是在行p1 = Parent()我得到了这个:

  

sqlalchemy.exc.ArgumentError:关系上的reverse_property'parent'Parent.child引用关系Child.parent,它不引用mapper Mapper | Parent | parent

对于一对多的关系不会发生这种情况,对于这段代码,我会按照我的预期打印 []

class User(Base):
    __tablename__ = 'user'
    id = Column(Integer, primary_key=True)
    name = Column(String)

    addresses = relationship("Address", back_populates="user")

class Address(Base):
    __tablename__ = 'address'
    id = Column(Integer, primary_key=True)
    email = Column(String)
    user_id = Column(Integer, ForeignKey('user.id'))

    user = relationship("User", back_populates="addresses")


u1 = User()
a1 = Address()

print(u1.addresses)
print(a1.user_id)

所以,我不太明白SQLAlchemy错误消息试图告诉我的内容。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

好的,文档代码中存在明显的错误。我发布这个以防万一其他人遇到同样的问题。

基本上,儿童类中的关系行必须是类,儿童类本身,如文档中所述。

此代码已更正并按预期工作(标记为已修改的部分):

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

class Child(Base):
    __tablename__ = 'child'
    id = Column(Integer, primary_key=True)
    parent_id = Column(Integer, ForeignKey('parent.id'))
    parent = relationship("Parent", back_populates="child")
                           ^^^^^^
p1 = Parent()
c1 = Child()

print(p1.id)
print(c1.parent_id)

按预期打印

这就是全部!