我如何定义一个关系,以便它在 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 可能因数据库而异。
我有两个表 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 可能因数据库而异。