설표의 장고




장고) PostgreSQL을 database로 이용하는 방법





주요 파일 경로

mysite/
|- config/
    |- settings/
        |- secret_psql.txt
        |- prod.py

읽기 전에

인스턴스 서버에 PostgresSQL 설치와 설정을 마친 상태라는 전제 하에 진행합니다.

SQLITE를 사용하지 않는 이유

사이트 소유주 혼자, 또는 매우 소수의 인원만 이용하는 사이트라면 SQLITE를 db로 사용해도 문제가 없습니다.
그러나, 많은 사람들이 동시에 db를 사용하게 되면 문제가 생깁니다.

sqlite는 누군가가 db에 기록을 하고 있을 때, 다른 이용자는 db를 이용할 수 없도록 db를 lock, 잠가버립니다.
이와 관련한 내용은 sqlite lock problem 또는 sqlite 동시성 문제 등으로 검색해보면 많은 글들을 찾아볼 수 있습니다.

이를 보완할 수 있는 방법이 없는 것은 아니지만, 그냥 다른 database를 이용하는 것이 쉽기 때문에 sqlite를 사용하지 않습니다.

sqlite 대신 장고에서 가장 좋아하는 PostgreSQL을 사용해볼 겁니다.

PostgreSQL
PostgreSQL is the most capable of all the databases here in terms of schema support.
PostgreSQL
PostgreSQL은 스키마 지원 측면에서 모든 데이터베이스 중에서 가장 뛰어난 성능을 발휘합니다.

https://docs.djangoproject.com/en/5.0/topics/migrations/#postgresql

장고용 database 생성하기

가장 먼저 장고 프로젝트에서 사용할 데이터베이스를 생성합니다.
간단하게 "django"라는 이름으로 생성했습니다.

(django) ubuntu:~$ psql -U postgres
Password for user postgres:
psql (14.12 (Ubuntu 14.12-0ubuntu0.22.04.1))
Type "help" for help.

postgres=# create database django;
CREATE DATABASE
postgres=# \q

(django) ubuntu:~$

psycopg 패키지 설치하기

장고에서 psql(PostgreSQL)을 사용하기 위해서는 "psycopg" 또는 "psycopg2" 패키지를 설치해야 합니다.
장고 공식 문서에서는 "psycopg2"는 향후 제거될 가능성이 있으니 "psycopg" 사용하라고 권장하고 있습니다.

(django) ubuntu:~$ pip install psycopg
Collecting psycopg
  Downloading psycopg-3.2.1-py3-none-any.whl (197 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 197.7/197.7 KB 2.4 MB/s eta 0:00:00
Requirement already satisfied: typing-extensions>=4.4 in ./django/lib/python3.10/site-packages (from psycopg) (4.12.2)
Installing collected packages: psycopg
Successfully installed psycopg-3.2.1
(django) ubuntu1:~$

secret_psql.txt 생성하기

psql 접속 정보를 담은 "secret_psql.txt" 파일을 다음과 같은 형식으로 저장합니다.

# config/setttings/secret_psql.txt

{
  "HOST": "localhost",
  "PORT": "5432",
  "USER": "postgres",
  "PASSWORD": "****"
}

prod.py 수정하기

prod.py에 DATABASES 옵션을 선언합니다.

# config/settings/prod.py

from .local import *

DEBUG = False
ALLOWED_HOSTS = ['forum.seolpyo.com'] # 접속 가능한 도메인 추가
STATICFILES_DIRS = []
STATIC_ROOT = BASE_DIR / 'static'


with open(BASE_DIR / 'config/settings/secret_psql.txt') as txt:
    dict_psql = json.load(txt)

# database를 sqlite에서 postgres로 변경하기
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql', # postgresql용 db 백엔드
        'NAME': 'django', # db name
        'HOST': dict_psql['HOST'],
        'PORT': dict_psql['PORT'],
        'USER': dict_psql['USER'],
        'PASSWORD': dict_psql['PASSWORD'],
    }
}

업로드하기

파일질라(FileZilla)를 통해 로컬에서 변경 또는 추가한 파일을 인스턴스 서버에 업로드합니다.
파일질라 설치 방법은 링크로 대체합니다.

마이그레이션

makemigrations와 migrate를 진행한 다음, mysite.service를 재시작해줍니다.

(django) ubuntu:~$ python ~/django/mysite/manage.py makemigrations
(django) ubuntu:~$ python ~/django/mysite/manage.py migrate --settings=config.settings.prod
(django) ubuntu:~$ sudo systemctl restart mysite.service
(django) ubuntu:~$

설정 완료

이제부터 장고에서 PostgreSQL을 database를 사용하게 됩니다.
기존에 작성한 내용은 sqlite에 저장되어있기 때문에 사이트는 초기화된 것과 같은 상태가 됩니다.



이 글의 댓글 기능은 일부러 막아놓았습니다. 궁금한 내용이 있다면 게시판을 이용해주세요!


공감 : 0