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:列「フッター」にヌル値が含まれています
これをスキーマの移行に追加しました。
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
なにが問題ですか?
すべての移行はトランザクション内にあります。 PostgreSQLでは、1つのトランザクションでテーブルを更新してからテーブルスキーマを変更しないでください。
データの移行とスキーマの移行を分割する必要があります。最初に、次のコードを使用してデータ移行を作成します。
for sender in orm['fooapp.EmailSender'].objects.filter(footer=None):
sender.footer=''
sender.save()
次に、スキーマ移行を作成します。
manage.py schemamigration fooapp --auto
これで2つのトランザクションができ、2つのステップでの移行が機能するはずです。
これのもう1つの理由は、列をNOT NULL
実際に既にNULL
値を持っている場合。
この問題が発生しました。スキーマの移行でdb.start_transaction()およびdb.commit_transaction()を使用して、データの変更をスキーマの変更から分離することもできます。おそらく、個別のデータ移行を行うほどクリーンではありませんが、私の場合は、スキーマ、データ、そして別のスキーマ移行が必要になるため、一度にすべてを実行することにしました。