본문 바로가기
Study/PYTHON,Django

Django(2)-데이터베이스 연동

by 왕방개 2024. 1. 25.

*데이터베이스 접속 체크
1.데이터베이스 서버를 실행
=>Docker를 실행하고 MySQL 컨테이너를 실행

=>Dbeaver 를 이용해서 접속을 확인
데이터베이스 접속 정보
-사용할 데이터베이스 종류:MySQL
-데이터베이스 서버의 URL:localhost(127.0.0.1)
-데이터베이스 서버의 포트:3306( MySQL 기본 포트)
-데이터베이스 내에서 영역을 구분하기 위한 코드(MySQL의 경우는 데이터베이스):mysql
-계정:root
-계정 비번:wnddkd
MySQL의 경우는 8.0버전을 사용하는 경우 설정을 변경하지 않으면 비밀번호가 암호화되서 접속이 되므로 암호화 해제를 해야함

Django 프로젝트를 생성하고 기본설정을 수정
1)프로젝트를 저장할 디렉토리를 생성하고 프롬프트 이동

2)가상환경 생성 및 활성화 - 애플리케이션 만들때는 필수 그 이외의 경우는 생략 가능

=>python -m venv myvenv
=>myvenv\Scripts\activate

3)필요한 패키지 설치
=>pip install django mysqlclient

4)django 프로젝트 생성
django-admin startproject 프로젝트 이름 생성할 디렉토리 경로(.을 입력하면 현재 디렉토리)

5)django 애플리케이션 생성
python manage.py startapp 앱이름

6)프로젝트 디렉토리의 settings.py 파일 수정 - 기본설정
=>앱을 등록
INSTALLED_APPS=["앱이름"]

=>데이터베이스 접속정보 설정.
사용하고자 하는 엔진에 맞는 engine으로 변경.

DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.mysql",
        "NAME": "****",
"USER":"****",
"PASSWORD":"****",
"HOST":"127.0.0.1",
"PORT":"3306"
    }
}


=>시간대역 수정(옵션)
TIME_ZONE="Asia/Seoul"

7)데이터베이스 초기화(프로젝트를 처음 실행하기 전과 models.py 파일을 수정한 경우 수행)
=>python manage.py makemigrations
=>python manage.py migrate

8)관리자 생성- 관리자가 필요한 경우만 수행
python manage.py create superuser

9)django 프로젝트를 실행해서 웹 애플리케이션 서버 구동
=>python manage.py runserver
이 경우는 127.0.0.1:8000 으로 접속

=>python manage.py runserver 127.0.0.1:80
이 경우는 127.0.0.1 으로 접속

=>python mange.py runserver 0.0.0.0:80
외부에서 이컴퓨터의 IP로 접속이 되는데 배포할 때 사용

10)브라우저 확인

 

까지 Django(1) 복습




3.Model
1)django에서의 Model
=>데이터 서비스를 위한 layer
=>애플리케이션 내의 models.py 파일에 정의
=>models.py파일에 모델 클래스를 만들 수 있는데 모델 클래스 1개는 데이터베이스 테이블 1개와 매칭
=>모델 클래스를 만들 때는 django.db.models.Model 클래스를 상속받아야함
=>모델 클래스의 속성은 테이블의 컬림이 됩니다
=>primary key를 설정하지 않으면 자동으로 id 생성

2)속성의 타입
=>CharField
일반 문자열로 max_length 속성을 잉요해서 최대 길이를 설정해 주어야 합니다
EmailField.GemericIPAddresssField.CommaSeparateIntegetField,FilePathField,URLField등의 파생 클래스가 존재

=>TextField
char
varchar

txt:문자열 그대로
clob: 사이즈가 큰 데이터를 외부 파일로 저장하기 위한 타입
blob: 문자열을 바이트로 저장하기 위한 타입
이 3개는 인덱스 설정이 되지 않음. 그래서 Elastic Search 을 활용하면 정말 빨리 찾음

=>IntegerField
=>DecimalField

=>BooleanField

=>DateTimeField

=>BinaryField

=>FileField
=>ImageField
=>UUIDField:UUID는 숫자와 문자로 만들어지는 해시값. 어떤 값이 만들어질지 모릅니다.


3)필드옵션-제약 조건
=>null
=>blank:null은 안됨.required 만들 때 사용

=>primary_key
=>unique

=>default

4)모델 생성 및 적용
=>모델을 만들고, 데이터베이스에 적용하게 되면 만들어진 table이나 연결되는 테이블 이름은 앱이름_모델이름이 됩니다.
database에 테이블이 만들어져있으면 연결을 하고, 만들어져 있지 않으면 python manage.py migrate 명령으로 생성이 가능합니다

=>자신의 앱 디렉토리에 있는 models.py에 작성

from django.db import models

# Create your models here.
class Item(models.Model):
  itemid=models.CharField(max_length=40,primary_key=True)
  itemname=models.CharField(max_length=50)
  price=models.IntegerField()
  description = models.CharField(max_length=50)
  pictureurl= models.CharField(max_length=50)



=>모델의 변경 내용을 데이터베이스에 적용
python manage.py makemigrations

python manage.py migrate

이렇게 하고 데이터베이스에 myweb_item(자신의 앱_자신의 클라스)이라는 테이블이 생성
만약 데이터베이스 테이블 명 변경하려면 models.py에 있는 변수명 변경후 make migrations migrate 하면 수정됨
=>어떤 종류의 데이터베이스도 가능

5)샘플데이터 삽입

insert into myweb_item values(1, 'Lemon', 500, 'Vitamin-A', 'lemon.jpg'); 
insert into myweb_item values(2, 'Orange', 1500, 'Vitamin-B', 'orange.jpg'); 
insert into myweb_item values(3, 'Kiwi', 2000, 'Vitamin-C', 'kiwi.jpg'); 
insert into myweb_item values(4, 'Grape', 1000, 'Vitamin-D', 'grape.jpg'); 
insert into myweb_item values(5, 'Strawberry', 2000, 'Vitamin-E', 'strawberry.jpg'); 
insert into myweb_item values(6, 'Mandarin', 300, 'Vitamin-F', 'mandarin.jpg'); 

commit;

select * from myweb_item;



6)CRUD 작업 방법
=>삽입
모델 클래스를 가지고 객체를 생성하고 save()을 호출하면 삽입

=>테이블의 전체 데이터 가져오기
모델클래스.objects.all()을 호출하면 모델 객체의 cursor를 리턴

=>하나의 데이터를 가져오기
모델클래스.objects.get(pk=기본키값)

=>조건에 맞는 데이터를 가져오고 싶을때
모델클래스.objects.filter(속성이름 연산자 값)

=>조건에 맞지 않은 데이터 가져오기
모델클래스.objects.exclude(속성이름 연산자 값)

=>기타
count()
order_by()
distinct()
first()
last()

=>수정
변수= 모델 클래스.objects.get(pk=값)
변수.속성=값
변수.save()

=>삭제는 save 대신에 delete() 호출

7)CRUD 실습

=>views.py 파일에 요청을 처리해주는 함수

from django.shortcuts import render
from django.http import HttpResponse
from myweb.models import Item

def index(request):
  #전체 데이터 가져오기
  data=Item.objects.all()
  return HttpResponse(data)



=>프로젝트 urls.py파일에 url과 요청을 연결

from django.contrib import admin
from django.urls import path
#my web이라는 디렉토리에 있는 views 파일의 내용을 가져오기
from myweb import views 

urlpatterns = [
    path("admin/", admin.site.urls),
    path("",views.index),
]



하고 python manage.py runserver

=>삽입 실습

from django.http import HttpResponse
from myweb.models import Item

def index(request):
  #전체 데이터 가져오기
  #모델 클래스의 인스턴스를 만들고 save 메서드를 호출
  #item 클래스의 인스턴스 생성
  item=Item()
  item.itemid = 7
  item.itemname = "아인슈패너"
  item.price= 7000
  item.description="가장 좋아하는 커피"
  item.pictureurl="coffee.png"
  
  #save호출
  item.save()
  data=Item.objects.all()
  return HttpResponse(data)



=>delete 실습

from django.shortcuts import render

# Create your views here.
from django.http import HttpResponse
from myweb.models import Item

def index(request):
  #전체 데이터 가져오기
  #모델 클래스의 인스턴스를 만들고 save 메서드를 호출
  #item 클래스의 인스턴스 생성
  item=Item()
  item.itemid = 7
  item.itemname = "아인슈패너"
  item.price= 8000
  item.description="가장 좋아하는 커피"
  item.pictureurl="coffee.png"
  
  #save호출
  item.delete()
  data=Item.objects.all()
  return HttpResponse(data)



=>데이터베이스는 지울께 없다고 오류가 나질 않음.

8)전체 데이터 보기 구현
=>views.py 파일수정

from django.shortcuts import render

# Create your views here.
from django.http import HttpResponse
from myweb.models import Item

def index(request):
  #item class와 연결된 테이블의 모든 데이터 가져오기
  data=Item.objects.all()
  #index.html 파일을 출력하는데 이 때 data라는 이름으로 data를 전달
  return render(request,'index.html',{'data':data})



=>애플리케이션 디렉토리 안에 html 파일을 저장할 templates 디렉토리 생성

#index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>전체 보기</title>
  
</head>
<body>
    <div align="center" class="body">
      <h2>상품목록화면</h2>
      <table border='1'>
        <tr class="header">
          <th align="center" width="80">상품ID</th>
          <th align="center" width="320">상품이름</th>
          <th align="center" width="100">가격</th>
        </tr>
        {% for item in data %}
          <tr class"record">
            <td align="center">{(item.itemid)}</td>
            <td align="center">{(item.itemname)}</td>
            <td align="center">{(item.price)}원</td>
          </tr>  
        {%endfor %}
            
      </table>
    <div>

</body>
</html>



=>탬플릿 엔진을 이용한 출력
일반 HTML은 자바스크립트를 이용하지 않으면 동적인 데이터를 출력할 수 없습니다
HTML과 CSS 은 정적파일(한번 만들면 소스 코드를 고치지 않은 이상 그대로 보여지는 파일)

템플릿 엔진은 서버의 데이터를 출ㄹ력하는 파일에 전달을 해서 템플릿 엔진의 문법으로 출력하는 코드를 작성하면 이를 HTML 코드로 번역해서 출력문을 만들어 줍니다.

django에서는 확장자가 html이지만 정적파일이 아니라서 templates 디렉토리에 작성합니다.
java에서는 jsp와 같은 의미

모든 정적파일은 다른 폴더에 저장해야합니다. 왜냐면 변화하지 않기 떄문에 캐싱안에 넣어놓는게 효과적

A라는 데이터는 한번 불러서 계속 쓰고 B라는 데이터를 가끔만 쓴다-> 그러면 A는 캐싱메모리안에 넣어놓는것 ==global


9) 전체보기에 CSS(CSS는 정적 파일)를 적용
=>index.html 파일의 최상단에 static 디렉토리의 내용을 읽어오는 코드를 작성
{% load static %}

=>index.html 파일에 css파일링크 추가

    <link rel="stylesheet" href="{%static'css/style.css'}%">

=>애플리케이션 디렉토리 안에 static 디렉토리 생성

=>애플리케이션 안에 static 디렉토리 안에 css 디렉토리 생성

=>css 디렉토리에 style.css 파일을 만들어서 css 코드를 작성

tr.header{
background:#C9BFED;}

tr.record{
background:#EDEDED;}

=>프로젝트의 settings.py에 추가
import os
STATICFILES_DIRS=(
    os.path.join(BASE_DIR,'static'),    

)

 



10)상세보기 구현
=>index.html 파일에서 제목부분에 링크 설정

<td align="center"><a href="{{ item.itemid }}">{{ item.itemid }}</a></td>

=>views.py 파일에 detail 요청을 처리하는 함수를 추가
#상세보기 요청을 처리하는 함수

def detail(request,itemid):
  #itemid의 값이 itemid인 데이터를 1개 가져옵니다
  item=Itehttp://m.objects.get(itemid=itemid)
  #detail.html 파일로 출력하는데 이 때 data 라는 이름으로 item을 전달
  return render(request,'detail.html',{'data':item})  

=>templates 디렉토리에 detail.html 파일을 생성하고 작성
urlpatterns에 path("detail/<int:itemid>",views.detail), 추가

 

'Study > PYTHON,Django' 카테고리의 다른 글

Django(3)-RestAPI 구현  (0) 2024.01.25
Django(1)-웹 프로그래밍 기초  (0) 2024.01.24
Python(4)-OOP심화  (0) 2024.01.19
PYTHON(3)-객체지향(OOP)  (0) 2024.01.09
Python(2)-모듈,패키지  (0) 2024.01.05