Fixtures를 사용해 모델에 초기 데이터를 제공하는 방법에 대해 알아보자.
초기 데이터의 필요성
- 협업하는 A, B 유저가 있다고 하자
- A가 먼저 프로젝트를 작업 후 github에 push 한다
- gitignore 설정으로 인해 DB는 업로드 하지 않기 때문에 A가 개발하면서 사용한 데이터는 올라가지 않는다.
- B가 github에서 A push한 프로젝트를 pull (혹은 clone) 한다.
- 마찬가지로 프로젝트는 받았지만 A가 생성하고 조작한 데이터는 없는 빈 프로젝트를 받게 된다.
- 이처럼 Django 프로젝트의 앱을 처음 설정할 때 동일하게 준비된 데이터로 데이터베이스를 미리 채우는 것이 필요한 순간이 있다.
- Django에서는 fixtures를 사용해 앱에 초기데이터(initial data)를 제공할 수 있다.
- 즉, migrations와 fixtures를 사용하여 data와 구조를 공유하게 된다.
M:N 까지 모두 작성된 Django 프로젝트에서 유저, 게시글, 댓글, 좋아요 등 각 데이터를 최소 2개 이상 존재한다고 가정해보자.
fixtures
fixtures 생성 및 로드
- 생성 (데이터 추출) : dumpdata
- 로드 (데이터 입력) : loaddata
dumpdata
- 응용 프로그램과 관련된 데이터베이스의 모든 데이터를 표준 출력으로 출력함
- 여러 모델을 하나의 json 파일로 만들 수 있음
$ python manage.py dumpdata [app_name[.ModelName] [app_name[.ModelName] ... ]] > {filename}.json
dumpdata 연습
articles app의 article 모델에 대한 data를 json 형식으로 저장하기
$ python manage.py dumpdata --indent 4 articles.article > articles.json
- manage.py와 동일한 위치에 data가 담긴
articles.json
파일이 생성됨
- dumpdata의 출력 결과물은 loaddata의 입력으로 사용됨
- fixtures 파일은 직접 만드는 것이 아니라 dumpdata를 사용하여 생성하는 것!
추가로 나머지 모델에 대한 데이터를 dump 하기
$ python manage.py dumpdata --indent 4 articles.comment > comments.json
$ python manage.py dumpdata --indent 4 accounts.user > users.json
[참고] 모든 모델을 한번에 dump 하기
$ python manage.py dumpdata --indent 4 articles.article articles.comment accounts.user > data.json
$ python manage.py dumpdata --indent 4 > data.json
loaddata
- fixtures 의 내용을 검색하여 데이터베이스로 로드
$ python manage.py loaddata data.json
- fixtures 기본 경로
app_name/fixtures/
- Django는 설치된 모든 app의 디렉토리에서 fixtures 폴더 이후의 경로로 fixtures 파일을 찾음
load data 연습
- fixtures의 내용을 검색하여 데이터 베이스로 로드
- dumpdata에서 만든 json 파일 기본 경로로 이동
- migrate, db.sqlite3 파일 삭제 후 migrate 작업 진행
$ python manage.py makemigrations
$ python manage.py migrate
$ python manage.py loaddata articles.json users.json comments.json
- load 후 데이터가 잘 입력되었는지 확인하기
loaddata를 하는 순서
- loaddata를 한번에 실행하지 않고 하나씩 실행한다면 모델 관계에 따라 순서가 중요할 수 있음
- comment는 article에 대한 key 및 user 에 대한 key 가 필요
- article은 user에 대한 key가 필요
- 즉, 현재 모델 관계에서는 user → article → comment 순으로 data를 넣어야 오류가 발 생하지 않음
$ python manage.py loaddata users.json
$ python manage.py loaddata articles.json
$ python manage.py loaddata comments.json
loaddata 시 encoding codec 관련 에러가 발생하는 경우
2가지 방법 중 택 1
1. dumpdata시 추가 옵션 작성
$ python - Xutf8 manage.py dumpdata [생략]
2. 메모장 활용
- 메모장으로 json 파일 열기
- 다른이름으로 저장 - 인코딩을 UTF 8로 선택
정리
fixtures 파일은 직접 만드는 것이 아니라 dumpdata를 사용하여 생성하는 것이다.
📍 프로젝트 전체 코드 확인
https://github.com/mjieun0956/TIL/tree/master/Database/08.%20Fixtures