작성된 프로젝트들이 내용이 방대해지며 코드들의 정리도 되지 않아 큰 덩어리들의 app로 분리하려는 중 코드 이전 이외에 DB와 관련한 mirgation에 대한 내용을 정리해보려 합니다.
예를 들어 account app 안에 blog, event와 같은 내용이 모두 존재하여 분리하려 합니다.
기존에 작성된 app안에서 migration등을 진행하였기 때문에 models에 대한 내용을 app을 분리하여 옮기기 된다면 아래와 같은 상황이 발생합니다.
- account migrations
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.DeleteModel(
)
]
- blog migrations
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
)
]
데이터가 삭제되는 참사를 막기 위해서는 아래의 순서로 진행합니다.
1. python manage.py makemigrations
2. python manage.py migrate --fake
--fake 옵션을 주어 해당 마이그레이션에 대한 내용이 수행된 것 처럼 보일 수 있습니다.
기존 DB명을 db_table을 통해 연결시켜 주었기에 데이터 삭제 없이 그대로 사용이 가능합니다.
단, 실제 반영되어야할 필드를 추가할 경우도 있을 수 도 있기 때문에 app, migration file별로 migrate 시켜줄 수 도 있습니다.
추가로 django migrate와 관련한 내용 참고하시면 좋을 듯 합니다.
python manage.py showmigrations
현재 생성된 마이그레이션에 대한 정보를 확인가능
[] 빈칸이라면 현재 적용되지 않은 migration, [X] 일시 반영된 migration
--dry-run --verbosity 3으로 옵션을 줄시 migrations 파일을 생성되지 않고 cli창에서 생성될 migraiton에 대한 정의, 파일명을 보여주게됩니다.
python manage.py migrate --fake zero
모든 migrations 대해 취소를 정의합니다.
--fake {app} zero 로 옵션을 줄시 해당 app에 대한 migrations 취소
python manage.py sqlmigrate {app명} {migration번호}
해당 마이그레이션에 대한 실행된 sql을 확인 해볼 수 있습니다.