2011-08-02 5 views
3

考えるとDjangoのモデル:現実世界でDjangoモデルのカスケード削除が失敗するのはなぜですか?

 

class ContainerOwner(models.Model): 
    id = models.IntegerField() 

class Container(models.Model): 
    owner = models.ForeignKey(ContainerOwner) 

あなたが「ContainerOwner」に.delete()を呼び出した場合、それはその「ContainerOwner」が所有する「コンテナ」オブジェクトのすべてをカスケード削除するオブジェクト。

しかし私は実際の生活では、このカスケード削除が失敗すると思われるdjangoプロジェクトがあることがわかりました。散発的に、またシステムが大量にあるときに発生するようです。したがって、 "ContainerOwner"が削除された後、有効な "ContainerOwner"を持たない "Container"オブジェクトになります(これは不可能です。 'Container'は常に 'ContainerOwner'を持ちます)。

前に失敗していて、どのように発生しているのか説明できますか?カスケード削除は、アプリケーションまたはDBサーバーによるカスケード削除の途中で中止される可能性がありますか?


更新は、回答のフィードバックに基づいて質問:私たちは、 "ContainerOwner" オブジェクトのクエリセットを削除するには、削除クエリセットを使用している

2)当社は、MySQLでMyISAMテーブルを使用している

1)

3)私たちは非常に一般的な作用を有する

4)MySQLバックエンドどこContai」のDjangoのクエリセットnerOwner "オブジェクトは一度にすべて削除され、それらの" Container "オブジェクトもすべて削除する必要があります。これは1日に何十回も発生し、アプリケーションエラーの原因となる孤立した「コンテナ」オブジェクトが存在することに気づいています。削除の0.01%が孤児を抱えているように、削除の失敗率はごくわずかです。

答えて

2

それはあなたのアプリケーションについて多くの詳細のような知らなくても、あなたの実際の質問に答えることは本当に不可能です:あなたはContainerOwner.delete()またはContainer.delete()で任意のカスタムロジックを持っていますか

  1. を?
  2. ContainerOwnerのどこでもクエリーセットのdeleteを使用していますか?
  3. あなたはどのデータベースを使用していますか? ContainerOwner/Containerオブジェクト

しかし、最も重要なの削除

  • 作成/更新の一般的な使用パターン/:

    "Container" objects that have no valid "ContainerOwner" after the "ContainerOwner" has been deleted

    これはデータベースレベルで最初の場所で可能にすべきではありません、外部キーの制約がないか、FK制約(MySQL + MYISAMなど)をサポートしていないDBを使用している場合を除きます。それが前者の場合は、最初に修正する必要があります。後者の場合は、これが実際にアプリの重要性に応じて切り替えを検討してください。

  • +0

    ガイド付きの質問にお手伝いしてくれてありがとうございました。元の質問を一番下の回答で更新しました。 – MikeN

    0

    その間に他の誰かがコンテナを追加した場合、それは同じContainerOwnerを持ち、トランザクションの外にいると、削除に失敗します。このような状況でIntegrityErrorを取得する必要があります。

    また、djangoの外にあるコードがあり、他の矛盾するデータベース制約がある場合、これらはカスケード削除を防止します。

    データベースログを確認して、削除が失敗した理由を確認してください。