我如何定义一个关系,以便它在 SQLAlchemy 中只能有两个条目?

How can I define a relationship so that it can only have exactly two entries in SQLAlchemy?

我有两个表 DOOR 和 ROOM(见下文),其中每扇门应恰好与两个房间相关联,并且每个房间可以与一扇或多扇门相关联。 我如何使用 SQLAlchemy 定义此约束?

door_room_association = Table('association:door-room',
                              DeclarativeBase.metadata,
                              Column('door_id', ForeignKey('door.id'), primary_key=true),
                              Column('room_id', ForeignKey('room.id'), primary_key=true))

class Door(DeclarativeBase):
    id: Column(String, primary_key=true)
    locked: Column(Boolean)
    rooms = relationship('Room', secondary=door_room_association, back_populates="doors")

class Room(DeclarativeBase):
    id: Column(String, primary_key=true)
    name: Column(String)
    doors = relationship('Door', secondary=door_room_associaiton, back_populates="rooms")

在 Python 级别,您可以监听 events 修改与房间相关的门数。

@sa.event.listens_for(Room.doors, 'append')
def door_append_handler(target, value, initiator):
    if len(target.doors) == 2:
        raise ValueError('Too many doors')

由于这是 Python 级别,因此它不会阻止您的应用程序之外的进程添加门。如果您需要那种级别的保护,您可以考虑添加触发器(也许使用 custom DDL 结构)。触发器的 DDL 可能因数据库而异。