SQLAlchemy - 将自引用关系映射为一对多(声明形式)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQLAlchemy - 将自引用关系映射为一对多(声明形式)相关的知识,希望对你有一定的参考价值。

我想使用声明方法和SQLAlchemy映射Tag实体。标签可以有父(另一个标签)。

我有:

class Tag(Base):
    __tablename__ = 'tag'

    id = Column(Integer, primary_key=True)
    label = Column(String)

    def __init__(self, label, parentTag=None):
        self.label = label

如何添加“父”关系?

答案

您添加引用父项的ForeignKey,然后创建一个通过remote_side指定方向的关系。这在adjacency list relationships下记录。对于声明,你可以这样做:

class Tag(Base):
    __tablename__ = 'tag'

    id = Column(Integer, primary_key=True)
    label = Column(String)
    parent_id = Column(Integer, ForeignKey('tag.id'))

    parent = relationship('Tag', remote_side=[id])

如果您还想要反向关系,请将backref='children'添加到关系定义中。

另一答案

如果您需要孩子,您需要使用uselist

class Tag(Base):
    __tablename__ = 'tag'

    id = Column(Integer, primary_key=True)
    label = Column(String)
    child_id = Column(Integer, ForeignKey('tag.id'))

    children = relation('Tag', remote_side=[id], uselist=True)
另一答案

parent = relation('Tag') - 见http://www.sqlalchemy.org/docs/05/reference/ext/declarative.html#configuring-relations

另一答案
class Company(BaseModel):
    __tablename__ = 'companies'
    companyName = db.Column(db.String(50))
    contactPerson = db.Column(db.String(50))
    email = db.Column(db.String(50))
    mobile = db.Column(db.String(20))
    parentID = db.Column(db.Integer, db.ForeignKey('companies.id'))  # parent company ID
    childrenCompany = db.relationship('Company', remote_side='Company.id',
                                    backref=db.backref('children_company'))  # parent Company

使用:

In [2]: company_query = Company.query.get_or_404(1)

In [3]: company_query.children_company
Out[3]: 
[<app.models.user.Company at 0x10f527850>,
 <app.models.user.Company at 0x10f527c10>]

以上是关于SQLAlchemy - 将自引用关系映射为一对多(声明形式)的主要内容,如果未能解决你的问题,请参考以下文章

flask 中orm关系映射 sqlalchemy的查询

SQLAlchemy 增删改查 一对多 多对多

SQLAlchemy外键的使用

Hibernate自身一对多和多对多关系映射

SQLAlchemy 如何使用声明性映射一对一关系的单列

sqlalchemy一对一关系映射