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

Hug*_*ugo 38 python 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
Run Code Online (Sandbox Code Playgroud)

如何添加"父母"关系?

谢谢

Ant*_*sma 70

您添加引用父项的外键,然后创建一个通过远程端指定方向的关系.这在邻接列表关系中记录.对于声明,你可以这样做:

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])
Run Code Online (Sandbox Code Playgroud)

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

  • 该网址已移至http://www.sqlalchemy.org/docs/orm/relationships.html?highlight=adjacency%20list#adjacency-list-relationships (2认同)
  • 网址再次移动(到http://docs.sqlalchemy.org/en/latest/orm/self_referential.html) (2认同)

Far*_*eed 6

如果您需要孩子,您需要使用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)
Run Code Online (Sandbox Code Playgroud)