【问题标题】:SQLAlchemy - Mapping self-referential relationship as one to many (declarative form)SQLAlchemy - 将自引用关系映射为一对多(声明形式)
【发布时间】:2010-04-14 14:32:22
【问题描述】:

我想使用 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

如何添加“父”关系?

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

    您添加一个引用父级的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' 添加到关系定义中。

    【讨论】:

    【解决方案2】:

    如果需要孩子,需要使用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)
    

    【讨论】:

    • 这个“关系”是不是“关系”的原始东西。
    【解决方案3】:
    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>]
    

    【讨论】:

      【解决方案4】:

      【讨论】:

      • 我试试这个,但给我一个错误:sqlalchemy.exc.ArgumentError:无法确定关系 Tag.parent 上的父/子表之间的连接条件。指定一个“primaryjoin”表达式。如果这是多对多关系,则还需要“secondaryjoin”。谢谢
      • 迟到的评论,你需要parent_id = Column(Integer, ForeignKey('tag.id'))来避免这个错误
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-05
      • 2020-09-18
      • 2011-10-10
      • 2017-05-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多