[Django] db.sqlite3 안에 저장된 데이터 옮기기

dj-yang·2021년 7월 18일
0

django

목록 보기
3/7
post-thumbnail

서론

장고로 개발을 하다보면 로컬 서버에서 sqlite3를 데이터베이스로 많이 사용하게 된다. 가볍고, 편하고, 장고와 호환도 잘되는 느낌이다.

오늘은 데이터베이스를 dump하여 테이블 스키마가 같은 다른 프로젝트에서 해당 데이터를 사용해보려고 한다.


본론

dump 데이터 얻기

sqlite를 실행 후 .help를 입력하면 sqlite에 관련된 명령어들을 확인할 수 있다.
오늘 사용할 명령어는 4개에서 5개에 해당하는 간단한 작업이다.

명령어하는 일
.output출력할 파일명을 지정해주는 역할을 한다.
.dump데이터베이스에 대한 모든 정보를 덤프한다.
.exit & .quitsqlite shell을 종료한다.
.read파일에서 데이터베이스 정보를 읽어온다.

우선 복사할 db.sqlite3가 있는 위치로 이동한 후 sqlite3를 실행한다. 일반적으로 세팅을 변경하지 않았다면 manage.py에 있는 폴더에 있다.

> cd [project-directory]
> sqlite3 db.sqlite3

그럼 다음과 같이 sqlite 버전과 명령어를 입력할 수 있는 화면이 나타난다.

화면이 정상적으로 나오면 오늘 사용할 명령어들을 입력한다.

sqlite> .output backup_data.sql
sqlite> .dump
sqlite> .exit or .quit

만약 해당 dump data를 사용할 곳을 미리 만들어두었다면 .output 명령어와 함께 디렉토리를 지정해주면 된다.

sqlite> .output /[file-store-directory]/backup_data.sql

그럼 db.sqlite3 또는 해당 디렉토리에 backup_data.sql이라는 파일이 생성되었다.
해당 파일을 열어보면 INSERT 등 SQL 문들이 잔뜩 있는 것을 볼 수 있다.

다른 데이터베이스에 데이터 추가하기

먼저, 데이터가 옮겨지는 장고 프로젝트로 이동한다.

cd [another-project]

db.sqilte3 이름으로 파일을 하나 만들어준다.(여기서는 vim을 사용했다.)

> vi db.sqlite3
......
> :wq

만들어진 db.sqlite3 파일을 이용해서 sqlite 명령창을 다시 한번 실행한다.

> sqlite3 db.sqlite3

이제 빈 db.sqlite3를 컨트롤할 수 있는 명령창이 열렸다. dump 파일을 이용해서 데이터를 읽어온다.

sqlite> .read backup_data.sql
sqlite> .exit or .quit

직접 서버를 구동하거나 툴을 이용하면 데이터가 성공적으로 옮겨진 것을 확인할 수 있다.
이상, 같은 스키마를 가지고 있지만 다른 서버에서 구동시켜야하고 데이터베이스를 공유하기 싫을 때 사용할 수 있는 방법을 알아보았다. (이런 방식을 쓸 일이 있을까..)

현업에서는 어떻게 하는 지 궁금하다.


실패 사례

django migrate 명령어로 테이블을 만들어줬을 때

같은 스키마를 가지고 있으니 python manage.py migrate 명령어를 통해 db.sqlite3을 만들어주고 그 데이터베이스에 데이터를 읽어오려는 방식을 처음으로 시도했다.

CREATE TABLE 같은 경우에도 IS NOT EXISTS 옵션을 통해 만약 같은 이름의 테이블이 있어도 문제가 없을 것이라고 판단했다.

하지만 실제로 실행해보니 UNIQUE 관련된 에러가 계속 발생했고, 유저 관련된 부분에서 오류가 나기 시작했다.

게시물에 저장되어있던 relation 관계의 유저가 다 사라졌다...

결국 빈 파일을 만들어서 같은 작업을 반복했더니 문제 없이 실행되었다.


고찰

실패 사례의 오류 원인을 분석했다.

추측해보면 sqlite에서 파일을 읽어올 때 아래처럼 VALUES(id, ...)형태로 불러온다.

INSERT INTO django_migrations VALUES(3,'auth','0001_initial','2021-03-18 12:19:46.642335');

django-migrations 또한 id로 관리되는 객체인데 이미 참조되고 있는 id값으로 다시 한번 마이그레이트를 실행시켜서 '이미 사용하고 있는 마이그레이션 id 값이에요!!' 라고 말해주는 것 같다.

찾아보니 schema가 아니라 들어있는 데이터만 가져올 수 있는 방법이 있는 것 같은데 다음에 시간나면 시도 해봐야겠다.

창업을 시도하다가 실패하고 개발자로 전환한 지 얼마 안되어서 그런 지 하면 할 수록 공부할 것이 많아지는 것 같다. 여태까지 너무 얕게만 공부한 것 같아서 마음이 무겁다.


참고

sqlite docs - https://sqlite.org/cli.html
devkuma - http://www.devkuma.com/books/pages/1333

profile
비전공자가 고통받으며 개발합니다

0개의 댓글