1
私は以下のシスメワンを持っています。アラートにはステータスが変更され、1つだけ変更されます。 ステータスの変更には1つのアラートしか設定できません。ステータス変更も理由がmaney状態にすることができ一つの理由は、私は次のスキーマSqlalchemyは実際に1対1の関係を持っていますか
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でコミットします。次
alert.status
をしようとしてDBに同じアラートの2つのAlertStatusChangeオブジェクトを入れた後、私に次の警告
SAWarning: Multiple rows returned with uselist=False for lazily-loaded attribute 'Alert.status' % self.parent_property)
を与え、オブジェクトが返された最初のAlertStateChangeオブジェクトが追加されます。 2番目はdbにありますが無視されます。例外が発生してはいけませんか?これは実際のOneToOne関係ではありません。おそらくalert_idをプライマリキーとして追加するか、一意の値として追加するべきでしょうか?
DBレベルで1つ1つのアスペクトを実行する必要があることは間違いありません。アラートIDを主キー/外部キーとして使用するか、独自の制約を設定する必ず。 –
SQLAリレーションシップはORMのコンセプトであり、DB内のスキーマをマップするだけです。つまり、http://docs.sqlalchemy.org/en/latest/orm/tutorial.htmlから理解できました。 –