Python

[Django] DB 연결 및 데이터 추출 & 웹에 출력하기

s2h15 2024. 2. 6. 14:04
728x90

 

 

○ PyMySQL 설치하기

가상환경에서 입력

conda install -c conda-forge PyMySQL

 

 

○ 새로운 app 생성하기

django-admin startapp mysqlapp

python manage.py startapp mysqlapp

두가지의 방법이 있음 둘 중 아무거나 하면 됨

 

○ mysqlapp 잘 작동하는지 확인하기

함수명 index

HttpResponse("index 페이지 입니다.") 출력

url 패턴 : http://127.0.0.1:8000/mysql/

 

- views.py

from django.shortcuts import render
from http import HTTPResponse

# Create your views here.
def index(request):
    return HTTPResponse("index 페이지 입니다.")

- mysqlapp > urls.py

from django.urls import path
from . import views

urlpatterns = [
    # http://127.0.0.1:8000/mysql/
    path('',views.index )
    
]

 

- config > urls.py

from mysqlapp import views as mysqlapp_view


urlpatterns = [
    ### mysqlapp 의 urls.py 사용하기
    # http://127.0.0.1:8000/mysql/
    path("mysql/",include("mysqlapp.urls")),
    ]

 

- settings.py

INSTALLED_APPS 에 'mysqlapp' 추가

>> 추가하지 않아도 html 정도는 실행이 되지만 ORM 방식으로 DB와 연결할 때는 꼭 추가해줘야하기 때문에

무조건 추가하는 것이 낫다

 

 

◆ 데이터 여러건 조회하기( DB 연결 )

 

장바구니 리스트 조회하기

 

< 데이터 베이스 처리 순서 >

- DB 드라이버 연결

- DB 접속

- DB로부터 cursor 받아오기

- 조회/입력/수정/삭제 sql을 DB 서버로 요청 및 결과 받아오기

- DB 자원 반환

○  기본 환경 설정하기

- mysqlapp > urls.py

아래 url pattern 추가

# http://127.0.0.1:8000/mysql/cart_list
    path('/cart_list',views.cart_list )
   

- templates\mysqlapp > cart > cart_list.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <h2>장바구니 목록 출력하기</h2>
    <table border="1">
      <tr>
        <th>회원아이디</th>
        <th>주문번호</th>
      </tr>
      <tr>
        <td>a001</td>
        <td>20202020202</td>
      </tr>
    </table>
  </body>
</html>

 

 

- mysqlapp > views.py

# 데이터 여러건 조회하기
# /mysql/cart_list/
def cart_list(request):
    # model(DB)처리
    
    # 반환
    return render(
        request,
        "mysqlapp/cart/cart_list.html",
        {}
    )

○ 모델(DB) 처리하기

 

 

- mysqlapp > model > mysql.py

드라이버 연결 및 접속 관련 class Mysql_Model

 

# - DB 드라이버 연결
import pymysql

class Mysql_Model :
    ### 생성자
    def __init__(self):
        self.initDBInfo()
        self.DBConnection()
        self.DBCursor()
        
        
    ### DB 접속정보 정의
    def initDBInfo(self):
        self.host = "localhost"
        self.user = "gjuser"
        self.password = "dbdb"
        self.db = "gjdb"
        # 문자 인코딩 타입
        self.charset = "utf8"
        # 조회 시 컬럼명을 동시에 보여줄지 여부 설정
        self.cursorclass = pymysql.cursors.DictCursor
        # 입력/수정/삭제 시 DB에 자동반영 여부
        self.autocommit = True
        
# - DB 접속
    def DBConnection(self):
        try :
            self.conn = pymysql.connect(
                host = self.host, user = self.user, password = self.password, 
                db = self.db, charset = self.charset, cursorclass = self.cursorclass, 
                autocommit = self.autocommit
            )
            print("DB 접속 성공 --> ", self.conn)
        except :
            print("DB 접속 정보 확인이 필요합니다")
        
# - DB로부터 cursor 받아오기
    def DBCursor(self):
        self.cur = self.conn.cursor()
        
# - 조회/입력/수정/삭제 sql을 DB 서버로 요청 및 결과 받아오기
# - cart_model.py 에서 처리

# - DB 자원 반환
    def DBClose(self):
        try :
            self.cur.close()
            self.conn.close()
            print("DB 정보 반환 완료....")
        except :
            print("이미 DB 정보가 반환되었습니다")

 

 

- mysqlapp > model > cart_model.py

sql문을 이용하여 DB에서 데이터 조회

import pymysql
from mysqlapp.model.mysql import Mysql_Model

class Cart :
    # 생성자'
    def __init__(self):
        self.db = Mysql_Model()
        
        
    # 장바구니 전체 조회하기
    def getcartList(self):
        sql = """
        Select cart_member, cart_no    
        From cart   
        Order By cart_member,cart_no
        """
        ### DB에 요청하기 : cursor에 담기
        # rs_cnt : 실행 결과의 건수
        rs_cnt = self.db.cur.execute(sql)
        # 실행 결과 데이터
        rows = self.db.cur.fetchall()
        # DB 정보 반환
        self.db.DBClose()
        return rs_cnt, rows

 

 

- mysqlapp > views.py

# 데이터 여러건 조회하기
# /mysql/cart_list/
def cart_list(request):
    # model(DB)처리
    # Cart 생성하기
    cart = Cart()
    # 장바구니 전체 정보 조회하기
    # - cart_cnt : 정수값
    # - cart_list : [{'컬럼명' : 값 , '컬럼명' : 값 ...},{},{}]
    cart_cnt, cart_list = cart.getcartList()
    # 반환
    return render(
        request,
        "mysqlapp/cart/cart_list.html",
        {"cart_cnt" : cart_cnt,
         "cart_list" : cart_list}
    )

 

 

- templates\mysqlapp > cart > cart_list.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <h2>장바구니 목록 출력하기</h2>
    <h5>조회건수 : {{cart_cnt}}</h5>
    <table border="1">
      <tr>
        <th>회원아이디</th>
        <th>주문번호</th>
      </tr>
      {% for data in cart_list %}
      <tr>
        <td>{{data.cart_member}}</td>
        <td>{{data.cart_no}}</td>
      </tr>
      {% endfor%}
    </table>
  </body>
</html>

▶ {% for 문 %} 과  {% endfor%} 를 통해 반복적으로 cart_list의 데이터를 가져오고

각 key값(컬럼명)에 해당하는 데이터가 들어가게된다

 

 

 

브라우저에서 클릭한 아이디에 대한 정보 추출 및 출력

 

- mysqlapp > model > member_model.py

 회원정보 한 건 조회하기

import pymysql
from mysqlapp.model.mysql import Mysql_Model

class Member :
    # 생성자'
    def __init__(self):
        self.db = Mysql_Model()
        
        
    # 회원정보 한 건 조회하기
    def getmemberView(self,mem_id):
        sql =f"""
        Select mem_id, mem_name, mem_add1    
        From member
        Where mem_id = '{mem_id}'
        Order By mem_id
        """
        ### DB에 요청하기 : cursor에 담기
        # rs_cnt : 실행 결과의 건수
        rs_cnt = self.db.cur.execute(sql)
        # 실행 결과 데이터 - 한 건 조회이기에 fetchone
        row = self.db.cur.fetchone()
        # DB 정보 반환
        self.db.DBClose()
        return rs_cnt, row

 

 

- mysqlapp > views.py

 

from mysqlapp.model.member_model import Member

def mem_view(request):
    ### 요청 파라메터 받기 : request가 가지고 있음
    if request.method == "POST" :
        mem_id = request.POST.get("mem_id","none")
    elif request.method == "GET":
        mem_id = request.GET.get("mem_id","none")
    
    # DB 조회
    member = Member()
    rs_cnt, mem_view = member.getmemberView(mem_id)
    
    return render(
        request,
        "mysqlapp/member/mem_view.html",
        {"mem_id" : mem_id,
         "rs_cnt" : rs_cnt,
         "mem_view" : mem_view}
    )

 

 

- templates\mysqlapp > member > mem_view.html

 

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <h2>회원 상세 조회하기</h2>
    <table border="1">
      <tr>
        <th>회원아이디</th>
        <td>{{mem_view.mem_id}}</td>
      </tr>
      <tr>
        <th>회원이름</th>
        <td>{{mem_view.mem_name}}</td>
      </tr>
      <tr>
        <th>회원주소</th>
        <td>{{mem_view.mem_add1}}</td>
      </tr>
    </table>
  </body>
</html>

 

 

 

728x90