web-dev-qa-db-ja.com

SQLAlchemyはForeignKeyとしてnullを許可します

2つのモデルがあるとしましょう

class EntityModel(DB.Model):
    id = DB.Column(DB.Unicode(37), primary_key=True)

class DocumentModel(DB.Model):
    id = DB.Column(DB.Unicode(37), primary_key=True)
    entity_id = DB.Column(DB.Unicode(37), DB.ForeignKey('entity.id',   ondelete='cascade'), nullable=True)
    entity = DB.relationship('EntityModel')

Entity_idNULLで新しいドキュメントを作成できます。しかし、有効なentity_idをそのドキュメントに設定すると、それをnullに戻すことはできなくなります。エラーが発生します:

Cannot add or update a child row: a foreign key constraint fails

有効なentity_idがある場合、ドキュメントのentity_idにnullを設定するにはどうすればよいですか?

15
ma2s

oRM定義は問題ないように見えますが、DocumentModel.entity_idは実際にnull許容です。この場合、MySQLで実際のテーブル定義をチェックし、それがORM定義に対応していることを確認します。

-- make sure DocumentModel.entity_id is nullable :
SHOW CREATE TABLE DocumentModel\G 
UPDATE DocumentModel.entity_id SET entity_id = NULL WHERE entity_id = XXX;
7
MOCKBA

nullは子行には無効です。別の方法として、「null」の子にのみ使用される親を作成し、そのIDにキーを設定します。あなたが孤児の記録を望まないので、私はこれの目的を本当に理解していません。親子関係との関係が実際には1対多ではない場合は、別の関係タイプを検討するか、フィールドを追加して子レコードを非アクティブにする必要があります。

1
rfportilla