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 요청보내기를 해보았습니다.
'🖥Web > 🔥Django' 카테고리의 다른 글
[Django] 초급 React + Django 간단한 익명 블로그 만들기 9 (0) | 2021.11.27 |
---|---|
[Django] 초급 React + Django 간단한 익명 블로그 만들기 8 (0) | 2021.11.26 |
[Django] 초급 React + Django 간단한 익명 블로그 만들기 6 (0) | 2021.11.24 |
[Django] 초급 React + Django 간단한 익명 블로그 만들기 5 (0) | 2021.11.23 |
[Django] 초급 React + Django 간단한 익명 블로그 만들기 4 (0) | 2021.11.23 |