2017-03-10 15 views
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をプライマリキーとして追加するか、一意の値として追加するべきでしょうか?

+0

DBレベルで1つ1つのアスペクトを実行する必要があることは間違いありません。アラートIDを主キー/外部キーとして使用するか、独自の制約を設定する必ず。 –

+0

SQLAリレーションシップはORMのコンセプトであり、DB内のスキーマをマップするだけです。つまり、http://docs.sqlalchemy.org/en/latest/orm/tutorial.htmlから理解できました。 –

答えて

1

これらのアクションを実行します。

  • を設定uselist=Falseがセットunique=True
  • 関係にあなたはまた、子供
  • nullable=Falseを設定することができますし、厳密な1対の親カスタム__init__に追加することができますone

これで動作します。

関連する問題