데이터 추출과 삽입

Ethan·2024년 1월 17일
0

Dear

목록 보기
4/13

<dear>프로젝트에서 더미 데이터를 삽입하려 한다. 데이터를 삽입하는 것을 seeding 이라고 한다. 이번에는 데이터를 시딩하는 두 가지 방법을 알아본다.

1. loaddata를 통한 시딩

loaddata미리 작성된 데이터 파일을 통해 데이터를 시딩하는 방법이다.

데이터 파일은 json 또는 xml 의 형식을 사용할 수 있다.

본 포스팅에서는 json 형식의 파일을 통해 loaddata하는 방법을 알아본다.


1.1 json 파일 추출

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,
}
]

1.2 json 파일 수정

추출한 json 파일의 형식에 맞게 데이터를 추가한다.

#posts_data.json

[
{
  "model":"posts.post",
  "pk": 1,
  "title": abc1,
  "content": abcdefg,
},
{
  "model":"posts.post",
  "pk": 2,
  "title": abc2,
  "content": abcdefg,
}
]

1.3 json 파일을 데이터 베이스에 적용

수정한 json을 데이터베이스에 적용한다.

python manage.py loaddata posts_data.json

loaddata를 사용하면 posts_data.json 파일을 데이터베이스에 적용한다. 추가되는 것이 아닌, 기존의 데이터를 덮어쓰는 것을 주의해야 한다.

어떤 모델의 데이터베이스에 적용되는지는 json 파일의 model 키 에 따라 결정된다. 따라서 하나의 json 파일에서 여러 모델의 데이터베이스를 추가할 수 있다.


2. django-seed를 통한 시딩

만약 생성해야 할 데이터가 많다면, dumpdata를 통해 json 파일을 추출하고, 해당 json 파일에 데이터를 복사한 뒤, 복사한 데이터 수 만큼 pk값을 모두 변경해야 한다. 이런 번거로움을 django-seed를 통해 해결할 수 있다.


2.1 django-seed 설치

django-seed를 설치한다. <dear> 프로젝트의 가상환경은 django 2.2 버전을 사용하고 있어, 해당 버전과 호환되는 django_seed 0.2.2를 설치한다.

pip install django-seed==0.2.2

2.2 django-seed 앱 등록

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'  #하이픈이 아닌 언더바
]

2.3 seed 명령어 사용

시딩을 위한 준비가 끝났으니 seed 명령어를 통해 10개의 데이터를 추가해본다.

python manage.py seed posts --number=10

posts는 앱 이름이며 number는 생성할 데이터를 의미한다.

seed 명령어는 지정한 앱의 모든 모델의 데이터를 지정한 데이터 수 만큼 생성한다.

또한 seed 명령어는 유효성 검증을 무시한 채로 데이터를 생성하므로, 유효성 검증과 관련해서는 직접 데이터를 관리해야 한다.


2.3.1 특정 모델의 데이터만 생성

특정 모델의 데이터만 생성하고 싶다면 --seeder 옵션을 사용해 모델 이름을 입력하면 된다.

아래의 경우 posts 앱의 Post 모델에 5개의 데이터를 생성한다.

python manage.py seed posts --number=5 --seeder Post

2.3.2 특정 필드에 특정 데이터를 지정

특정 모델의 데이터를 생성하면서, 특정 필드의 값을 지정하고 싶다면

--seeder 옵션에서 모델이름.필드이름 붙이고 "로 감싼 형태로 입력한다.

그리고 원하는 값을 "로 감싼 형태로 입력한다.

아래의 경우 posts 앱의 Post 모델에 title 필드의 값이 dummy title인 5개의 데이터를 생성한다.

python manage.py seed posts --number=5 --seeder "Post.title" "dummy title"

2.3.2 여러 필드에 특정 데이터를 지정

특정 모델의 데이터를 생성하면서, 여러 필드의 값을 지정하고 싶다면 --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"
profile
글로 쓰면 머리 속에 정리가 되...나?

0개의 댓글

관련 채용 정보