이런저런 IT 이야기
Django + Prisma(Postgres) + Docker 구축 본문
반응형
https://github.com/leeyonghe/DjangoPrismaProject
샘플코드입니다. 미리 살펴보세요.
1. Docker 구성
- Python Server 1대
- python:3.8 서버 이미지를 사용
- 포트번호 8000번으로 적용
- 서버 실행시 반드시 prisma migrate 및 generate 명령어 사용
- npx prisma migrate dev && npx prisma generate --schema prisma/schema.prisma && python3 manage.py runserver 0:80
- Postgres DB 1대
- DB 사용자 및 패스워드 적용
- POSTGRES_USER: postgres
- POSTGRES_PASSWORD: postgres123!
- DB 사용자 및 패스워드 적용
- docker-compose.yml 파일 내용
version: '3.7'
services:
dp_project:
tty: true
container_name: dp_project
build:
context: .
dockerfile: Dockerfile
ports:
- "8000:80"
volumes:
- ./project/:/main
command: sh -c "npx prisma migrate dev && npx prisma generate --schema prisma/schema.prisma && python3 manage.py runserver 0:80"
depends_on:
- "postgres"
postgres:
container_name: postgres
tty: true
image: postgres
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres123!
PGDATA: /data/postgres
ports:
- "5432:5432"
restart: unless-stopped
- Dockerfile 내용 (Django 서버용)
FROM python:3.8
RUN apt update
RUN apt install nodejs -y
RUN apt install npm -y
RUN npm install -g npx
RUN pip install --upgrade pip
COPY requirements.txt /requirements.txt
RUN pip install -r /requirements.txt
WORKDIR /main
- npx 명령어를 사용하기 위해서 nodejs & npm & npx 단계적으로 설치
- npx 명령어는 docker-compose command에서 사용
2. Django 생성
$django-admin startproject project
- project 이름으로 프로젝트를 생성
- requirements.txt 파일 생성
psycopg2==2.9.6
Django==4.2.1
requests==2.30.0
djangorestframework==3.14.0
django-cors-headers==4.1.0
django-extensions==3.2.3
prisma==0.9.1
prisma-client==0.2.1
- setting.py에서 DB사용 주석 처리
- prisma를 사용하므로 별도 필요가 없음.
- setting.py에서 template 경로 추가
- template폴더에 main.html 생성
- 유저 정보를 표시
- views.py파일 생성 및 main함수 생성
async def Init(name, email):
db = Prisma(auto_register=False)
await db.connect()
await db.user.create(data = { 'name' : name, 'email' : email })
await db.disconnect()
async def getUser(email):
db = Prisma(auto_register=False)
await db.connect()
user = await db.user.find_unique(where={ 'email' : email })
await db.disconnect()
return user
def main(request):
email = "test@gmail.com"
name = "test"
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
loop.run_until_complete(Init(name, email))
loop.close()
return render(request, 'main.html', {})
# loop = asyncio.new_event_loop()
# task = loop.create_task(getUser(email))
# loop.run_until_complete(task)
# print("{}".format(task.result()))
# return render(request, 'main.html', { 'user' : task.result()})
3. Prisma(Posgtgres)
- prisma 파일 생성
generator client {
provider = "prisma-client-py"
interface = "asyncio"
recursive_type_depth = 5
}
datasource db {
provider = "postgresql"
url = "postgresql://postgres:postgres123!@postgres:5432/postgres?sslmode=disable"
}
model User {
id String @id @default(cuid())
name String?
email String? @unique
}
- databasece db 설정은 docker-compose에 나와있는 db정보를 적용 해야 한다.
- 간단히 User 테이블 생성
4. 폴더구조
- 폴더구조는 개인적인 구조로 정리되었으므로 이 글을 읽는 개발자가 자유롭게 적용하기 바람
5. 프로젝트 실행
$ docker-compose up -d --build
[+] Building 4.1s (15/15) FINISHED
...
[+] Running 2/0
✔ Container postgres Running 0.0s
✔ Container dp_project Running
- 현재 테이블이 비어있으므로 더미로 넣는 Init() 함수를 실행
from django.shortcuts import render
from prisma import Prisma
import asyncio
async def Init(name, email):
db = Prisma(auto_register=False)
await db.connect()
await db.user.create(data = { 'name' : name, 'email' : email })
await db.disconnect()
async def getUser(email):
db = Prisma(auto_register=False)
await db.connect()
user = await db.user.find_unique(where={ 'email' : email })
await db.disconnect()
return user
def main(request):
email = "test@gmail.com"
name = "test"
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
loop.run_until_complete(Init(name, email))
loop.close()
return render(request, 'main.html', {})
# loop = asyncio.new_event_loop()
# task = loop.create_task(getUser(email))
# loop.run_until_complete(task)
# print("{}".format(task.result()))
# return render(request, 'main.html', { 'user' : task.result()})
- 다시 실행시 getUser() 함수를 호출하도록 주석을 변경하여 실행
from django.shortcuts import render
from prisma import Prisma
import asyncio
async def Init(name, email):
db = Prisma(auto_register=False)
await db.connect()
await db.user.create(data = { 'name' : name, 'email' : email })
await db.disconnect()
async def getUser(email):
db = Prisma(auto_register=False)
await db.connect()
user = await db.user.find_unique(where={ 'email' : email })
await db.disconnect()
return user
def main(request):
email = "test@gmail.com"
name = "test"
# loop = asyncio.new_event_loop()
# asyncio.set_event_loop(loop)
# loop.run_until_complete(Init(name, email))
# loop.close()
# return render(request, 'main.html', {})
loop = asyncio.new_event_loop()
task = loop.create_task(getUser(email))
loop.run_until_complete(task)
print("{}".format(task.result()))
return render(request, 'main.html', { 'user' : task.result()})
- 아래와 같이 출력
6. 아래는 prisma 쿼리 작성 방법이 설명되어있는 링크
https://prisma-client-py.readthedocs.io/en/stable/
반응형