Django 10. DB 연동

 Django 10. DB 연동



1. 테이블 생성


settings.py 파일의 DATABASE 딕셔너리에 DB 관련 정보 작성

기본적으로 SQLite로 되어있고 다른 DB를 사용할 수도 있음


models.py 파일에 클래스를 이용해서 모델 생성

models.Model 을 상속받아서 작성

클래스 명은 테이블 명으로 작성

멤버 변수로 테이블의 컬럼 지정

models.[데이터 타입](옵션)


* 데이터 타입

 integer, char, boolean, date, decimal(float), text, file 등


* 옵션

null, blank, choice, default, primary_key, unique 등


PK 컬럼은 따로 지정하지 않으면 자동으로 생성됨



* 예시

class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateField("date published")

class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)



python3 manage.py makemigrations : magrations 폴더 안에 마이그래이션 파일(py) 생성

python3 manage.py migrate : 마이그래이션 파일을 DB에 적용해서 테이블 생성








* 데이터 표시

테이블의 해당 컬럼에 대한 정보를 지정하려면 모델 클래스에 __str__ 맴버함수를 정의해소 표시할 문자열을 반환

* 예시

class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateField("date published")

def __str__(self):
return self.question_text





2. SELECT 문


[테이블 클래스].objects.get( [조건] ) : 조회 결과가 하나 일때만 사용 가능. 결과가 없거나 1개보다 많으면 에러 발생

[테이블 클래스].objects.filter( [조건] ) : 조회 결과를 리스트로 반환. 결과가 없거나 1개보다 많아도 사용 가능



* Field LookUP

SELECT 문의 WHERE 절 역할

get(), filter() 함수의 괄호 한에 작성

[필드명]__[lookup type] = [value] 작성


* lookup type 종류

<=, <, >=, > : lte, lt, gte, gt

LIKE : exact (정확하게 일치)

ILIKE : iexact (대소문자 구분 안함)

LIKE "%abc%" : contains (포함)

IN : in

startswith, endwith : 시작하는지, 끝나는 지


* 중첩 SELECT 문

서브쿼리의 결과를 변수에 저장하고 SELECT문의 Field Lookup에 value로 사용


* 예시

q = Question.objects.filter(pk=0)
c = Choice.objects.filter(id__in=q)



* join

get, filter함수 안에 Field LookUp를 작성할 때 [참조할 테이블]__[참조할 테이블의 컬럼]=[ value ] 로 작성하면 자동으로 조인 연산


* 예시

Choice.objects.filter(Question__question_text="hello")




* 여러 조건 결합

from django.db.models import Q

Q() 안에 Field LookUp 작성

get, filter 함수 안에 Q()를 넣을 수 있음

|(or), ,(and), ~(not) 등을 이용해서 여러 조건을 결함 가능



* 정렬

objects의 order_by() 함수 이용

() 안에 정렬 기준 컬럼 작성

컬럼 앞에 -를 붙이면 내림차순 정렬



* 외래키

자신을 외래키로 갖는 모든 모델에 접근하려면 [자신을 외래키로 가지는 테이블 이름(소문자)]_set을 사용


* 예시

q = Question.objects.get(pk=1)

q.choice_set.all()
q.choice_set.filter(vote__lte=2)
q.choice_set.count()





3. 테이블 수정


새로운 컬럼을 추가하는 경우에는 기본값을 주거나 null 이나 blank을 허용해서 기존에 있던 데이터에 에러가 발생하지 않도록 처리

컬럼을 지우면 해당 컬럼을 이용하던 코드들도 수정

테이블을 정의한 class에 컬럼을 추가하거나 삭제하고 터미널에서 makemigrations, migrate 명령어를 차례대로 수행하면 새로운 마이그래이션 파일이 생성되고 DB의 테이블이 변경됨


* 예시

class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateField("date published")
# 추가 컬럼
owner = models.CharField(
max_length=200,
blank=True
)









* Roll Back

DB의 테이블을 이전의 상태로 되돌릴 수 있음

migriations폴더에 생성되는 마이그레이션 파일(py)를 이용

터미널에 python3 manage.py migrate [앱 이름] [롤백해서 돌아갈 마이그래이션 파일 (확장자 x)]

작성




4. INSERT


데이터를 삽입할 테이블 클래스의 생성자에 각 컬럼의 데이터를 입력

pk 컬럼의 값은 자동으로 추가됨

클래스의 인스턴스의 full_clean() 메소드를 호출해서 유효성 검사. 유효하지 않으면 에러 발생

데이터가 유요하다면 인스턴스의 save() 메소드를 호출해서 DB에 저장


* 예시

from django.utils import timezone
# 오늘 날짜를 받아옴
now = timezone.now()

q = Question(question_text="Hello", pub_date=now, owner="a")
q.full_clean()
q.save()










5. UPDATE


수정할 데이터를 불러 와서 수정할 컬럼을  수정하고 save() 함수를 호출해서 DB에 반영


* 예시

# 수정할 데이터 불러오기
q = Question.objects.get(id=2)

# 수정할 컬럼 수정
q.question_text = "Hello World"

# DB에 반뎡
q.save()




6. DELETE


삭제할 데이터 인스턴스 객체의 delete() 메소드 호출

q.delete()



7. DB와 템플릿 연동


view.py 에서 DB의 데이터를 받아와서 파라미터로 전송


* 예시 - Question 테이블의 데이터를 pub_date를 기준으로 내림차순 정렬해서 전달

from .models import Question

def index(request):
question_list = Question.objects.order_by("-pub_date")
    param = {"question_list":question_list}

return render(request, "polls/main2.html", param)


템플릿에서 해당 파라미터의 값을 받아와서 화면에 출력


* 예시

{% if question_list %}
<ul>
{% for question in question_list %}
<li><a href="{% url "polls:detail" question.id %}">
                             {{ question.question_text }}</a></li>
{% endfor %}
</ul>
{% else %}
<p>No poll</p>
{% endif %}












* 해당 데이터가 존재하는지 확인하기

django.shortcuts 의 get_object_or_404 임포트

get_object_or_404( [테이블 클래스], [찾을 데이터 조건])

조건에 해당하는 데이터가 테이블에 없으면 404 에러를 발생시킴


* 예시

from django.shortcuts import get_object_or_404

q = get_object_or_404(Question, pk=1)






8. MySql 연동


- 커넥터 설치

파이썬에서 Mysql와 통신할 수 있도록 mysqlclient 설치

 파이썬 3.9 버전 까지만 지원되므로 가상환경을 생성하고 파이썬 버전을 3.9로 설정

pip3 install mysqlclient 명령어로 설치


- DB 설정

sqlite 가 아닌 mysql등을 사용할 때 프로젝트를 GitHub 등에 업로드 할 때는 반드시 DB 관련 정보를 숨겨야 함

루트 경로에 my_settings.py 파일 생성

DATABASES 딕셔너리와 SECRET 변수 생성

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'DjangoTest',
'USER': 유저네임,
'PASSWORD': 비밀번호,
'HOST': 'localhost',
'PORT': '3306',
}
}

SECRET_KEY = #settings.py 의 SECRET_KEY 변수의 값

NAME : 데이터베이스 이름 

USER : 유저 이름

PASSWORD : 비밀번호

HOST : 호스트

PORT : 포트번호 (mysql은 기본적으로 3306 사용)

(데이터베이스, 유저 등의 설정은 

https://kumioriscodingdiary.blogspot.com/2023/03/spring-boot-2-maria-spring-data-jpa.html 참조)

+ 유저에 해당 DB에 대한 권한 부여

왼쪽 상단 메뉴의 Administration -> User and Privileges -> 유저 선택-> Schema Privileges -> Add Entry -> Select schema -> DB 선택 -> Select All -> Apply



* my_settings.py 파일은 github에 업로드되면 안되므로 프로젝트의 루트 경로에 .gitignore 파일을 생성하고 my_settings.py 작성



settings.py에서 my_settings 를 임포트하고 DATEBASES와 SECRET_KEY를 my_settings.py로 대체

import my_settings

SECRET_KEY = my_settings.SECRET_KEY

DATABASES = my_settings.DATABASES



- DB 연동

python3 manage.py migrate : DB와 연결하고 DB에 django 테이블들이 생성됨

앱의 models.py에 모델 클래스를 생성

python3manage.py makemigrations : 마이그레이션 파일 생성

python3 manage.py migrate 작성 -> DB에 models.py에 작성한 클래스 테이블이 생성됨







댓글

이 블로그의 인기 게시물

Spring Boot 6. 계시판 프로젝트

Spring Boot 2. Maria 데이터베이스 & Spring Data JPA