<dear>
프로젝트에서 더미 데이터를 삽입하려 한다. 데이터를 삽입하는 것을seeding
이라고 한다. 이번에는 데이터를 시딩하는 두 가지 방법을 알아본다.
loaddata
는미리 작성된 데이터 파일
을 통해 데이터를 시딩하는 방법이다.
데이터 파일은
json
또는xml
의 형식을 사용할 수 있다.
본 포스팅에서는
json
형식의 파일을 통해loaddata
하는 방법을 알아본다.
json
은 데이터를 표현하기 위해 사용하는 대표적인 포맷이다. 파이썬의 사전형 자료와 유사하며, 데이터를키와 값
을 쌍으로 이루어 표현한다.
우리 프로젝트의 데이터가
json
형식으로 저장되면 어떤 모습일지는 데이터를 추출해보면 된다.
python manage.py dumpdata posts --indent=2 > posts_data.json
명령어를 살펴보면
posts 앱
의 데이터를posts_data.json 파일
로 저장한다는 의미이며indent
는 각 코드의들여쓰기
를 의미한다.indent
를 사용하면 데이터가 보기 좋게 정렬된다.
#posts_data.json
[
{
"model":"posts.post",
"pk": 1,
"title": abc1,
"content": abcdefg,
}
]
추출한
json
파일의 형식에 맞게 데이터를 추가한다.
#posts_data.json
[
{
"model":"posts.post",
"pk": 1,
"title": abc1,
"content": abcdefg,
},
{
"model":"posts.post",
"pk": 2,
"title": abc2,
"content": abcdefg,
}
]
수정한
json
을 데이터베이스에 적용한다.
python manage.py loaddata posts_data.json
loaddata
를 사용하면posts_data.json
파일을 데이터베이스에 적용한다. 추가되는 것이 아닌, 기존의 데이터를덮어쓰는 것
을 주의해야 한다.
어떤 모델의 데이터베이스에 적용되는지는
json
파일의model 키
의값
에 따라 결정된다. 따라서 하나의json
파일에서여러 모델
의 데이터베이스를 추가할 수 있다.
만약 생성해야 할 데이터가 많다면,
dumpdata
를 통해json
파일을 추출하고, 해당json
파일에 데이터를 복사한 뒤, 복사한 데이터 수 만큼pk
값을 모두 변경해야 한다. 이런 번거로움을django-seed
를 통해 해결할 수 있다.
django-seed
를 설치한다.<dear>
프로젝트의 가상환경은django 2.2
버전을 사용하고 있어, 해당 버전과 호환되는django_seed 0.2.2
를 설치한다.
pip install django-seed==0.2.2
django-seed
를 사용하기 위해프로젝트 구성 디렉토리
의settings.py
에 등록한다. 주의할 점은 하이픈이 아닌 언더바를 넣어django_seed
로 등록해야 한다.
#settings.py > INSTALLED_APPS
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'posts',
'django_seed' #하이픈이 아닌 언더바
]
시딩을 위한 준비가 끝났으니 seed 명령어를 통해 10개의 데이터를 추가해본다.
python manage.py seed posts --number=10
posts
는 앱 이름이며number
는 생성할 데이터를 의미한다.
seed
명령어는 지정한 앱의모든 모델
의 데이터를 지정한 데이터 수 만큼 생성한다.
또한
seed
명령어는유효성 검증
을 무시한 채로 데이터를 생성하므로, 유효성 검증과 관련해서는직접 데이터를 관리
해야 한다.
특정 모델의 데이터만 생성하고 싶다면
--seeder
옵션을 사용해모델 이름
을 입력하면 된다.
아래의 경우
posts
앱의Post
모델에 5개의 데이터를 생성한다.
python manage.py seed posts --number=5 --seeder Post
특정 모델의 데이터를 생성하면서, 특정 필드의 값을 지정하고 싶다면
--seeder
옵션에서모델이름
에.필드이름
붙이고"
로 감싼 형태로 입력한다.그리고 원하는 값을
"
로 감싼 형태로 입력한다.
아래의 경우
posts
앱의Post
모델에title
필드의 값이dummy title
인 5개의 데이터를 생성한다.
python manage.py seed posts --number=5 --seeder "Post.title" "dummy title"
특정 모델의 데이터를 생성하면서, 여러 필드의 값을 지정하고 싶다면
--seeder
옵션을 추가하기만 하면 된다.
아래의 경우
posts
앱의Post
모델에title
필드의 값이dummy title
이며,content
필드의 값이dummy content
인 5개의 데이터를 생성한다.
python manage.py seed posts --number=5 --seeder "Post.title" "dummy title" --seeder "Post.content" "dummy content"