我有以下语义。警报可以有状态变化,但只能有一个。
状态变化只能有一个警报。一个状态变化可以有一个原因,同时一个原因可以存在于多个状态变化中。
我尝试了以下模式。
class Alert(BaseDb):
__tablename__ = 'alerts'
__table_args__ = (
PrimaryKeyConstraint('id', name='pk_alerts'),
)
id = Column(Integer)
alert_text = Column(Text)
class AlertStateChange(BaseDb):
__tablename__ = 'alert_state_change'
__table_args__ = (
PrimaryKeyConstraint('id', name='pk_alert_state_change'),
ForeignKeyConstraint(
['reason_id'],
['reasons.id'],
name='fk_alert_status_change_reason_id__reasons'
),
ForeignKeyConstraint(
['alert_id'],
['alerts.id'],
name='fk_alert_status_change_alert_id__alert'
),
)
id = Column(Integer)
reason_id = Column(Integer)
alert_id = Column(Integer)
reason = relationship('Reason', backref='status')
alert = relationship('Alert',
backref=backref('status', uselist=False))
status = Column(Text)
但SQLAlchemy允许我为相同的警报(相同的alert_id)添加AlertStateChange对象。它会像通常一样提交并生成新的id。当将两个相同警报的AlertStatusChange对象放入数据库后,尝试以下操作:
alert.status
会给我以下警告
SAWarning: Multiple rows returned with uselist=False for lazily-loaded attribute 'Alert.status' % self.parent_property)
返回的对象是添加的第一个AlertStateChange对象。第二个在数据库中但被忽略了。这不是真正的一对一关系。应该会抛出异常吗?我应该将alert_id添加为主键或唯一值,对吗?