[Django] 프로젝트 app 분리 시 migration 관련 내용

금지수·2022년 10월 23일
0

Python

목록 보기
3/4

작성된 프로젝트들이 내용이 방대해지며 코드들의 정리도 되지 않아 큰 덩어리들의 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. 기존 내용을 이전해서 가는 것이 아니라 DB에서는 Drop and Create가 발생합니다.
  2. 즉, 해당 테이블의 내용이 모두 삭제됩니다.

데이터가 삭제되는 참사를 막기 위해서는 아래의 순서로 진행합니다.

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을 확인 해볼 수 있습니다.
profile
언젠간 하겠지

0개의 댓글