163

TextField から null=True を削除したい:

-    footer=models.TextField(null=True, blank=True)
+    footer=models.TextField(blank=True, default='')

スキーマの移行を作成しました:

manage.py schemamigration fooapp --auto

一部のフッター列には次のものが含まれNULLているためerror、移行を実行すると次のようになります。

django.db.utils.IntegrityError:列「フッター」にnull値が含まれています

これをスキーマの移行に追加しました。

    for sender in orm['fooapp.EmailSender'].objects.filter(footer=None):
        sender.footer=''
        sender.save()

今私は得る:

django.db.utils.DatabaseError: cannot ALTER TABLE "fooapp_emailsender" because it has pending trigger events

なにが問題ですか?

4

8 に答える 8

184

NOT NULLこれのもう 1 つの理由は、実際には既に値があるときに列を設定しようとしたためかもしれませんNULL

于 2014-02-25T16:58:06.070 に答える
172

すべての移行はトランザクション内にあります。PostgreSQL では、1 つのトランザクションでテーブルを更新してからテーブル スキーマを変更してはなりません。

データの移行とスキーマの移行を分割する必要があります。まず、次のコードを使用してデータ移行を作成します。

 for sender in orm['fooapp.EmailSender'].objects.filter(footer=None):
    sender.footer=''
    sender.save()

次に、スキーマの移行を作成します。

manage.py schemamigration fooapp --auto

これで 2 つのトランザクションがあり、2 つのステップでの移行が機能するはずです。

于 2012-10-11T11:06:29.343 に答える
22

操作で、SET CONSTRAINTS を入れました。

operations = [
    migrations.RunSQL('SET CONSTRAINTS ALL IMMEDIATE;'),
    migrations.RunPython(migration_func),
    migrations.RunSQL('SET CONSTRAINTS ALL DEFERRED;'),
]
于 2020-03-24T10:41:57.583 に答える
0

私の場合、私は持っています

  1. フィールドの追加
  2. RunPython
  3. フィールドの削除

次に、最後のRemoveFiedを新しい移行ファイルに移動したところ、問題が修正されました

于 2021-11-10T16:19:10.810 に答える