# Django : SQLite to PostgreSQL

- Author: @baealex
- Published: 2020-11-03
- Updated: 2021-08-31
- Source: http://blex.me/@baealex/django-sqlite-to-postgresql
- Tags: 백엔드, 데이터베이스, 장고

---

나중에 DB 전환할때 해메지 않으려고 기록...

<br>

#### Install Postgres in Docker

`docker-compose`에 아래와 같이 `postgresql` 도커를 선언하자.

```docker
db:
  image: postgres
  restart: always
  volumes:
    - ./db/data:/var/lib/postgresql/data
  ports:
    - 5432:5432
  environment:
    POSTGRES_USER: "username"
    POSTGRES_PASSWORD: "password"
    POSTGRES_DB: "dbname"
    TZ: "Asia/Seoul"
```

<br>

#### Django Settings

`django`의 `settings.py`에서 `DATABASES` 부분 찾기

```python
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}
```

기본적으로 위와같이 선언되있다. 이미 `SQLite`에 데이터가 쌓여서 마이그레이션이 필요한 경우 아래 명령어로 `dump.json`에 데이터를 빼주자.

```python
python manage.py dumpdata --natural-foreign --natural-primary -e contenttypes --indent=4 > dump.json
```

이제 위 `postgresql` 도커에 선언한 내용들로 채워준다.

```python
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'dbname',
        'USER': 'username',
        'PASSWORD': 'password',
        'HOST': 'db',
        'PORT': '5432',
    }
}
```

다만 필자의 경우 실행시 오류가 발생하여 장고 도커 이미지에 아래 패키지를 추가 설치하여 해결하였다.

```bash
sudo apt-get install -y python3-psycopg2
```

`postgresql`에 테이블 생성 및 어플리케이션 모델 동기화

```python
python manage.py migrate
python manage.py migrate --run-syncdb
```

`dump.json`의 내용을 로드하려면 아래 명령어를 입력하자.

```python
python manage.py loaddata dump.json
```

<br>

#### TODO:

- 도커 컴포즈에서 시스템 변수를 적극 활용하는 방법 익혀야함
  - 지속적으로 유지 가능한 방법을 찾아야함
  - `.bashrc`에서 `export`한 변수는 못쓰는 건가?
- 데이터 로드할때 `max_length`가 초과한 데이터가 있음을 확인, 발생한 원인 파악 및 선처리 필요
- `postgres`로 테스트 진행시 백엔드 몇몇 구간에서 인코딩 오류가 발생하는 것을 확인, 해결방안 모색 필요

#### 복붙용 코드

덤프

```python
python manage.py dumpdata --natural-foreign --natural-primary -e contenttypes --indent=4 > dump.json
```

로드

```python
python manage.py migrate && python manage.py migrate --run-syncdb && python manage.py loaddata dump.json
```
