在同一表中使用SQLAlchemy实现多对一关系

10 投票
2 回答
12199 浏览
提问于 2025-04-16 15:38

我有一个“客户”表,其中一个客户可以是另一个客户的子客户。

这是表的定义。

[ClientID] [int] IDENTITY(1,1) NOT NULL,
[name] [varchar](50) NOT NULL,
[VPFSID] [varchar](50) NOT NULL,
[Type] [varchar](25) NULL,
[ROHostID] [varchar](60) NOT NULL,
[RWHostID] [varchar](60) NOT NULL,
[ParentClientID] [int] NULL

在SQLAlchemy中,我该如何建立ParentClientID和ClientID之间的关系。我用声明式的方法写了这个类,但不确定这样是否有效。一个客户可以有多个子客户,但只能有一个父客户,所以这是一个多对一的关系。

class Client(Base):
    """ Client Filesystems """
    __tablename__ = 'Client'

    client_id = Column('ClientID', int, primary_key=True, nullable=Flase)
    name = Column('name', String(50), nullable=False)
    vpfs_id = Column('VPFSID', String(50), nullable=False)
    type = Column('Type',String(25))
    ro_host_id = Column('ROHostID', String(60), ForeignKey('DataMover.HostID'), nullable=False)
    rw_host_id = Column('RWHostID', String(60), ForeignKey('DataMover.HostID'), nullable=False)
    rw_host = relation('Datamover',backref="rw_clients")
    ro_host = relation('Datamover',backref="ro_clients")
    parent_client_id = Column('ParentClientID',int,ForeignKey('Client.ClientID'))
    parent = relation('Client',ForeignKey('Client.ClientID'))

有什么建议可以实现这个吗?

2 个回答

1

我的Flask小技巧

class Comment(db.Model):
    __tablename__ = "comments"
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    time = db.Column(db.DateTime, default=datetime.now)
    data = db.Column(db.JSON)

    """ relationships within the same table """
    reply_to_comment_id = db.Column(db.Integer, db.ForeignKey('comments.id'))
    reply_to_comment = db.relationship('Comment', remote_side=[id])

    def __repr__(self):
        return f'<Comment id:{self.id}>'

我花了很长时间在想怎么在Flask里做到这一点。上面评论里的例子帮了我很多,但我忘了设置ForeignKey,结果遇到了很多错误,折腾了很久。

19
class Client(Base):
    ...<snip>...
    parent = relation('Client', remote_side=[client_id])

这里有文档:orm/self_referential.html

撰写回答