반응형
Django-DB-Migrations : 보류중인 트리거 이벤트가 있으므로 ALTER TABLE을 사용할 수 없습니다.
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 : "footer"열에 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
뭐가 잘못 되었 니?
이에 대한 또 다른 이유는 열에 NOT NULL
실제로 이미 NULL
값 이있을 때 열을 설정하려고하기 때문일 수 있습니다.
모든 마이그레이션은 트랜잭션 내부에 있습니다. PostgreSQL에서는 테이블을 업데이트 한 다음 하나의 트랜잭션에서 테이블 스키마를 변경해서는 안됩니다.
데이터 마이그레이션과 스키마 마이그레이션을 분할해야합니다. 먼저 다음 코드를 사용하여 데이터 마이그레이션을 만듭니다.
for sender in orm['fooapp.EmailSender'].objects.filter(footer=None):
sender.footer=''
sender.save()
그런 다음 스키마 마이그레이션을 만듭니다.
manage.py schemamigration fooapp --auto
이제 두 개의 트랜잭션이 있으며 두 단계의 마이그레이션이 작동합니다.
이 문제가 발생했습니다. 스키마 마이그레이션에서 db.start_transaction () 및 db.commit_transaction ()을 사용하여 스키마 변경과 데이터 변경을 구분할 수도 있습니다. 아마도 별도의 데이터 마이그레이션이있을만큼 깨끗하지는 않지만 제 경우에는 스키마, 데이터 및 다른 스키마 마이그레이션이 필요하므로 한 번에 모두 수행하기로 결정했습니다.
반응형
'Programming' 카테고리의 다른 글
자유 함수가 예상되는 멤버 함수를 어떻게 전달할 수 있습니까? (0) | 2020.08.18 |
---|---|
시퀀스에 일치하는 요소가 없습니다. (0) | 2020.08.18 |
Active Directory에서 사용자 목록을 얻으려면 어떻게해야합니까? (0) | 2020.08.18 |
Arrays.asList (array)와 새로운 ArrayList의 차이점 (0) | 2020.08.18 |
안드로이드 응용 프로그램이 전경에 있는지 확인하십시오. (0) | 2020.08.18 |