[Django/DB] 모델에 초기 데이터 제공하기 (Fixtures)

문지은·2023년 5월 9일
0

Django + Database

목록 보기
8/12
post-thumbnail

Fixtures를 사용해 모델에 초기 데이터를 제공하는 방법에 대해 알아보자.

초기 데이터의 필요성

  • 협업하는 A, B 유저가 있다고 하자
    1. A가 먼저 프로젝트를 작업 후 github에 push 한다
      • gitignore 설정으로 인해 DB는 업로드 하지 않기 때문에 A가 개발하면서 사용한 데이터는 올라가지 않는다.
    2. 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 하기

# 3개의 모델을 하나의 json 파일로
$ python manage.py dumpdata --indent 4 articles.article articles.comment accounts.user > data.json

# 모든 모델을 하나의 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
  • fixtures load 하기
$ 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

profile
코드로 꿈을 펼치는 개발자의 이야기, 노력과 열정이 가득한 곳 🌈

0개의 댓글