본문 바로가기
🖥Web/🔥Django

[Django] 초급 React + Django 간단한 익명 블로그 만들기 7

by 후누스 토르발즈 2021. 11. 25.
반응형

 

 

 

psycopg2 설치, postgresql DB 연동, core 앱 생성, migrations 관리, models 정의, model object의 query, 터미널에서 http 요청보내기

 

 

 

psycopg2

  • Psycopg는 Python 프로그래밍 언어용으로 가장 널리 사용되는 PostgreSQL 데이터베이스 어댑터입니다.
  • 주요 기능은 Phyton DB API2.0 사양의 완전한 구현과 스레드 안전성(여러 스레드가 동일한 연결을 공유할 수 있음)입니다. 그것은 많은 커서를 생성 및 파괴하고 많은 수의 동시 "INSERT" 또는 "UPDATE"를 만드는 다중 스레드 응용 프로그램을 위해 설계되었습니다.
  • 클라이언트 측 및 서버 측 커서, 비동기 통신 및 알림, "COPY TO/COPT FROM" 지원이 특징입니다.
  • 많은 Python 유형이 즉시 지원되며 PostgreSQL 데이터 유형과 일치하도록 조정됩니다.
  • 유연한 개체 적응 시스템 덕분에 적응을 확장하고 사용자 지정할 수 있습니다.

 

 

 

pip install psycopg2 명령어를 사용하여 패키지를 내려받습니다

 

 

 

core라는 app을 하나 만들어줍니다.

 

 

 

실행하는경우에 자동으로 migrations 디렉터리가 만들어집니다.

 

 

 

 

settings.py에 INSTALLED_APPS 하나에 값들을 넣어놓았던 것을 분할해서 정의하여 INSTALLED_APPS의 값을 변경하도록 하겠습니다.

 

 

 

DATABASES 값을 정의하는 부분도 있는데 값을 이렇게 설정해줍니다.

 

 

 

python3 manage.py inspectdb 명령어 입력시 db의 테이블들이 Model로 생성되는걸 볼 수 있습니다.

 

 

 

기본생성되는 모델들과 TbBoard와 TbBoardComment 모델이 만들어진 것을 볼 수 있습니다. 디비 연동이 잘 되었고 model이 잘 생성되었습니다.

 

Django는 기존 데이터베이스를 검사하여 모델을 만들 수 있는 :djadmin:〉inspectdb’라는 유틸리티와 함께 제공됩니다.

 

python3 manage.py inspectdb > core/models.py 명령어를 사용하여 core/models.py 안에 넣었습니다.

 

 

 

사실 현재 사용하고있는 테이블은 TbBoard와 TbBoardComment만 넣어도 되지만 전부 넣은대로 놔두겠습니다.

# This is an auto-generated Django model module.
# You'll have to do the following manually to clean this up:
#   * Rearrange models' order
#   * Make sure each model has one field with primary_key=True
#   * Make sure each ForeignKey and OneToOneField has `on_delete` set to the desired behavior
#   * Remove `managed = False` lines if you wish to allow Django to create, modify, and delete the table
# Feel free to rename the models, but don't rename db_table values or field names.
from django.db import models
from django.utils import timezone

class AuthGroup(models.Model):
    name = models.CharField(unique=True, max_length=150)

    class Meta:
        managed = False
        db_table = 'auth_group'


class AuthGroupPermissions(models.Model):
    id = models.BigAutoField(primary_key=True)
    group = models.ForeignKey(AuthGroup, models.DO_NOTHING)
    permission = models.ForeignKey('AuthPermission', models.DO_NOTHING)

    class Meta:
        managed = False
        db_table = 'auth_group_permissions'
        unique_together = (('group', 'permission'),)


class AuthPermission(models.Model):
    name = models.CharField(max_length=255)
    content_type = models.ForeignKey('DjangoContentType', models.DO_NOTHING)
    codename = models.CharField(max_length=100)

    class Meta:
        managed = False
        db_table = 'auth_permission'
        unique_together = (('content_type', 'codename'),)


class AuthUser(models.Model):
    password = models.CharField(max_length=128)
    last_login = models.DateTimeField(blank=True, null=True)
    is_superuser = models.BooleanField()
    username = models.CharField(unique=True, max_length=150)
    first_name = models.CharField(max_length=150)
    last_name = models.CharField(max_length=150)
    email = models.CharField(max_length=254)
    is_staff = models.BooleanField()
    is_active = models.BooleanField()
    date_joined = models.DateTimeField()

    class Meta:
        managed = False
        db_table = 'auth_user'


class AuthUserGroups(models.Model):
    id = models.BigAutoField(primary_key=True)
    user = models.ForeignKey(AuthUser, models.DO_NOTHING)
    group = models.ForeignKey(AuthGroup, models.DO_NOTHING)

    class Meta:
        managed = False
        db_table = 'auth_user_groups'
        unique_together = (('user', 'group'),)


class AuthUserUserPermissions(models.Model):
    id = models.BigAutoField(primary_key=True)
    user = models.ForeignKey(AuthUser, models.DO_NOTHING)
    permission = models.ForeignKey(AuthPermission, models.DO_NOTHING)

    class Meta:
        managed = False
        db_table = 'auth_user_user_permissions'
        unique_together = (('user', 'permission'),)


class DjangoAdminLog(models.Model):
    action_time = models.DateTimeField()
    object_id = models.TextField(blank=True, null=True)
    object_repr = models.CharField(max_length=200)
    action_flag = models.SmallIntegerField()
    change_message = models.TextField()
    content_type = models.ForeignKey('DjangoContentType', models.DO_NOTHING, blank=True, null=True)
    user = models.ForeignKey(AuthUser, models.DO_NOTHING)

    class Meta:
        managed = False
        db_table = 'django_admin_log'


class DjangoContentType(models.Model):
    app_label = models.CharField(max_length=100)
    model = models.CharField(max_length=100)

    class Meta:
        managed = False
        db_table = 'django_content_type'
        unique_together = (('app_label', 'model'),)


class DjangoMigrations(models.Model):
    id = models.BigAutoField(primary_key=True)
    app = models.CharField(max_length=255)
    name = models.CharField(max_length=255)
    applied = models.DateTimeField()

    class Meta:
        managed = False
        db_table = 'django_migrations'


class DjangoSession(models.Model):
    session_key = models.CharField(primary_key=True, max_length=40)
    session_data = models.TextField()
    expire_date = models.DateTimeField()

    class Meta:
        managed = False
        db_table = 'django_session'


class TbBoard(models.Model):
    board_seq = models.DecimalField(primary_key=True, max_digits=65535, decimal_places=65535)
    board_title = models.CharField(max_length=30)
    board_content = models.CharField(max_length=20, blank=True, null=True)
    board_writer = models.CharField(max_length=40)
    board_password = models.CharField(max_length=80)
    create_date = models.DateTimeField(default=timezone.now())

    class Meta:
        managed = False
        db_table = 'tb_board'


class TbComment(models.Model):
    board_seq = models.ForeignKey(TbBoard, models.DO_NOTHING, db_column='board_seq')
    comment_detail_seq = models.DecimalField(primary_key=True, max_digits=65535, decimal_places=65535)
    comment_depth = models.DecimalField(max_digits=65535, decimal_places=65535)
    comment_title = models.CharField(max_length=40)
    comment_writer = models.CharField(max_length=40)
    comment_password = models.CharField(max_length=40)
    create_date = models.DateTimeField(default=timezone.now())

    class Meta:
        managed = False
        db_table = 'tb_comment'

 

두 테이블의 create_date = models.DateTimeField(default=timezone.now()) 부분만 직접 수정하였습니다.

 

 

 

 

python3 manage.py showmigrations 를 입력시 마이그레이션한 리스트를 볼 수 있습니다. core부분은 no migrations로 없는것으로 표기되어있습니다.

 

 

 

마이그레이션을 시도해봅니다. makemigrations 로 새로운 마이그레이션을 생성 후에 다시 migrate 해달라고 합니다.

 

 

 

python3 manage.py makemigrations 해줍니다.

 

 

 

이번에는 아까 Operations to perform: 에 없었던 core가 추가된것이 보입니다.

 

 

 

db table을 보면 생성이 되어있습니다.

 

 

 

다시 python3 manage.py showmigrations를 확인해보면 migrations이 생긴것이 보입니다.

 

 

 

만일 이 작업을 거쳤는데도 python3 manage.py makemigrations 하였을때 생성이 되지 않는다면 가상환경 디렉터리로 이동하여 마이그레이션 관련 파일들을 제거해줍니다.

 

 

 

그다음 위 과정을 다시 시작하려는데 문제가 생기는 경우 Django를 reinstall해야합니다.

그리고 다시 위 과정을 거치면 정상적으로 가동 될 것입니다.

 

 

 

파이썬 서버를 가동시킵니다.

 

 

 

간단하게 요청의 응답만 확인해보겠습니다.

 

urls.py

from django.contrib import admin
from django.urls import path
from .views.about import get_views_about
from .views.board import insert_board

urlpatterns = [
    path('about/', get_views_about),
    path('insertBoard/', insert_board),
]

 

 

 

 

views/board.py

# rest
from django.http import HttpResponse, JsonResponse
from django.views.decorators.csrf import csrf_exempt
from rest_framework.parsers import JSONParser

from anonymous_blog_server.utils.board import insert_utils_board

@csrf_exempt
def insert_board(request):
    return JsonResponse(data=insert_utils_board())

 

 

 

utils/board.py

# from django.db import models
from core import models

def insert_utils_board():
    return {
        'responseCode' : True,
    }

 

 

 

+ 를 눌러서 새로운 bash를 엽니다.

 

 

 

터미널환경에서 restapi 요청을 할 수 있는 명령어 입니다.

 

crul -X GET http://localhost:8000/insertBoard/

 

 

 

왼쪽에 {"responseCode": true} 를 볼 수 있습니다. 응답입니다.

 

 

이렇게까지 psycopg2 설치, postgresql DB 연동, core 앱 생성, migrations 관리, models 정의, model object의 query, 터미널에서 http 요청보내기를 해보았습니다.

반응형