<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"