이전 포스트에서는 MySQL을 연동하는 방법을 알아보았습니다.

하지만 이 방법으로는 나중에 추가적인 기능을 개발하고, 또 다시 연동하는 데 있어서 매우 어려움이 있습니다..

즉, 계속해서 데이터베이스를 다시 접근하고 닫고를 반복해야 하는 이유 때문입니다.


따라서, DB를 따로 새로운 클래스로 구분하여 이를 사용하는 방법이 필요합니다.


이번에는 MySQL을 이용하기 위한 클래스 생성 및 연동하는 방법을 알아보도록 하겠습니다.


다른 플라스크 예제는 아래의 링크를 살펴봐주시기 바랍니다~



[Python Flask] 웹 페이지 만들기 01 - 환경 설정

[Python Flask] 웹 페이지 만들기 02 - 기본 파일 작성하기

[Python Flask] 웹 페이지 만들기 03 - 파이썬에서 웹으로 값 전달

[Python Flask] 웹 페이지 만들기 04 - Bootstrap 연동하기

[Python Flask] 웹 페이지 만들기 05 - MySQL 연동하기(pymysql)






01. 개발 디렉토리 설정 변경

먼저 개발을 수행하기 앞서, 프로젝트 내부에 있는 디렉토리를 추가적으로 생성할 필요가 있습니다.

우리가 추가할 디렉토리는 다음과 같이 나타나 있습니다.


[Project Name]

└ [app]

      └ [test]

            └ 테스트를 위한 폴더

      └ [module]

            └ 모듈로써 사용할 python 소스

      └ [schema]

            └ MySQL에서 실행할 SQL 소스

      └ [static]

            └ 자바스크립트, CSS, 이미지 등...

      └ [templates]

            └ HTML 파일들(폴더별로 정리 가능)

            └ [test]

                  └ 테스트를 위한 폴더

└ config.py

└ run.py


기존의 디렉토리에 module이라는 폴더를 새로 생성하고 그 아래에 우리가 사용할 module로써 사용할 python 소스를 작성할 것입니다.

여기서 우리는 dbModule.py라는 파일을 생성합니다.




02. Database 클래스 모듈 파일 작성

이 파일은 새로운 기능을 생성할 때마다 import 시켜 사용될 파일입니다.

dbModule.py 파일은 다음과 같습니다.

# file name : dbModule.py
# pwd : /project_name/app/module/dbModule.py

import pymysql

class Database():
    def __init__(self):
        self.db = pymysql.connect(host='localhost',
                                  user='root',
                                  password='your_password',
                                  db='your_dbname',
                                  charset='utf8')
        self.cursor = self.db.cursor(pymysql.cursors.DictCursor)

    def execute(self, query, args={}):
        self.cursor.execute(query, args)  

    def executeOne(self, query, args={}):
        self.cursor.execute(query, args)
        row = self.cursor.fetchone()
        return row

    def executeAll(self, query, args={}):
        self.cursor.execute(query, args)
        row = self.cursor.fetchall()
        return row

    def commit():
        self.db.commit()


원래는 Database 클래스를 선언하고, execute함수를 사용한 후 fetch함수와 commit() 함수 등으로 DB를 이용해야 했습니다.

하지만 위와 같은 클래스를 이용하면 보다 편리하게 사용할 수 있게 됩니다.

그러면 이제 이 클래스를 사용해보도록 하겠습니다.




03. Database 클래스 사용 예제

이 예제는 Database를 사용하기 위한 예제입니다.

여기서 제공되는 예제는 sql 소스, python 소스, HTML 소스가 있습니다.


SQL 예제 소스

-- file name : test.sql
-- pwd : /project_name/app/schema/test.sql

CREATE DATABASE testDB default CHARACTER SET UTF8;

use testDB;

CREATE TABLE testTable(
    idx      INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    test     VARCHAR(256) NOT NULL
) CHARSET=utf8;


이제 이 예제를 이용하여 INSERT, SELECT, UPDATE를 모두 실습해보도록 합니다.

먼저 실습 파이썬 파일을 제작하기 전에 Ubuntu 16.04. 의 MySQL에 테이블을 생성하도록 합니다.


MySQL DB 생성 및 Table 생성은 다음 예제와 같습니다.


이제 DB 생성과 Table 생성이 모두 완료되었으니, INSERT 예제와 SELECT, UPDATE 예제를 살펴보시겠습니다.



HTML 소스 예제

먼저 HTML 소스를 통해 파이썬 소스를 실행할 버튼들을 만들어봅시다.

HTML 소스는 다음과 같습니다.

<!DOCTYPE html>
<html lang="en">
<head>
  <h1> head Test </h1><br>
</head>

<body>

  <input type="button" value="INSERT 예제" onclick="location.href='/test/insert'">
  <input type="button" value="SELECT 예제" onclick="location.href='/test/select'">
  <input type="button" value="UPDATE 예제" onclick="location.href='/test/update'">

  <br><br><br>
  <div>
      INSERT result : {{result}}
  </div>
  <br>
  <div>
      SELECT result idx  : {{resultData.idx}}<br>
      SELECT result test : {{resultData.test}}
  </div>
  <br>
  <div>
      UPDATE result idx  : {{resultUPDATE.idx}}<br>
      UPDATE result test : {{resultUPDATE.test}}
  </div>
  <br>
  
</body>
</html>


여기서 각각 INSERT 예제, SELECT 예제, UPDATE 예제를 실행시킬 버튼과 결과를 보여주는 영역을 작성했습니다.

이제 파이썬 소스를 보시겠습니다.



Python 소스 예제

Python 소스는 위의 HTML 소스 예제와 마찬가지로 각각의 예제로 작성되었습니다.

# file name : test.py
# pwd : /project_name/app/test/test.py

from flask import Blueprint, request, render_template, flash, redirect, url_for
from flask import current_app as current_app

from app.module import dbModule

test = Blueprint('test', __name__, url_prefix='/test')

@test.route('/', methods=['GET'])
def index():
    return render_template('/test/test.html',
                            result=None,
                            resultData=None,
                            resultUPDATE=None)



# INSERT 함수 예제
@test.route('/insert', methods=['GET'])
def insert():
    db_class = dbModule.Database()

    sql      = "INSERT INTO testDB.testTable(test) \
                VALUES('%s')" % ('testData')
    db_class.execute(sql)
    db_class.commit()

    return render_template('/test/test.html',
                           result='insert is done!',
                           resultData=None,
                           resultUPDATE=None)



# SELECT 함수 예제
@test.route('/select', methods=['GET'])
def select():
    db_class = dbModule.Database()

    sql      = "SELECT idx, test \
                FROM testDB.testTable"
    row      = db_class.executeAll(sql)

    print(row)

    return render_template('/test/test.html',
                            result=None,
                            resultData=row[0],
                            resultUPDATE=None)



# UPDATE 함수 예제
@test.route('/update', methods=['GET'])
def update():
    db_class = dbModule.Database()

    sql      = "UPDATE testDB.testTable \
                SET test='%s' \
                WHERE test='testData'" % ('update_Data')
    db_class.execute(sql)    
    db_class.commit()

    sql      = "SELECT idx, test \
                FROM testDB.testTable"
    row      = db_class.executeAll(sql)

    return render_template('/test/test.html',
                            result=None,
                            resultData=None,
                            resultUPDATE=row[0])



이제 이 파일을 실행시키게 되면 다음과 같은 모습으로 나타나게 됩니다.


INSERT 예제 수행 결과


SELECT 예제 수행 결과


UPDATE 예제 수행 결과



+ Recent posts