RESTful flask API - 파이썬으로 DB에 값 넣기 (POST)

반응형

이번 포스팅은 DB와 연결하여 클라이언트가 값을 넣는 방법을 설명합니다.

DB 연동 과정은 이전 포스팅을 참고해주세요.

https://luvris2.tistory.com/182

 

API서버 - DB 연동하기

API서버 DB연동하기 DB : MySQL Programming language : Python IDE : Visual Studio Code MySQL DB 생성 (recipe) Table 생성 (recipe, user) DB를 관리 할 수 있는 권한 설정하기 (MySQL) SQL 쿼리 use mysql;..

luvris2.tistory.com


Visual Studio Code

API 서버 구축하기

  • 메인 파일 이름 : app.py
# app.py

from flask import Flask
from flask_restful import Api
from resources.recipe import RecipeListResource

# API 서버를 구축하기 위한 기본 구조
app = Flask(__name__)

# restfulAPI 생성
api = Api(app)

# 경로와 리소스(api코드) 연결
api.add_resource(RecipeListResource, '/recipes')

if __name__ == '__main__' :
    app.run()

 

 

DB에 값 넣기

  • 소스 코드
    • 1. DB 연동 소스 코드가 있는 파일을 호출하여 함수 실행, 파일 이름과 함수는 사용자에 따라 다름
      • 파일 호출 : from mysql_connection import get_connection
      • DB 연동 : 변수 = get_connection()
    • 2. 처리 할 SQL 쿼리문 입력
      • 값 입력 : 변수 = ''' insert into TABLE (columns1, 2 ...) values (1, 2, ...) '''
        • ''' text ''' : 다줄 입력을 가능하게 해주는 코드
    • 3. 커서 객체 생성
      • 커서(Cursor) : SQL 실행코드의 결과값을 저장하는 객체
      • cursor = connection.cursor() : 연동된 데이터베이스의 커서 객체 생성
        • connection은 임의로 지정한 DB의 정보가 담긴 변수, 사용자마다 다를 수 있음
    • 4. 커서를 이용하여 SQL 쿼리문 실행
      • cursor.execute(query) :변수 query 이용하여 SQL 쿼리문을 실행, 결과값을 커서에 저장
    • 5. 데이터 저장
      • .commit : DB에 저장하는 명령어
      • 커밋을 하지 않으면 DB에 값이 정상적으로 입력되지 않음
    • 6. 시스템 자원 반환
      • .close() : 할당된 시스템 자원을 반환
# POST Method를 이용하여 DB에 값 넣기
# RecipeListResource.py

# 라이브러리 호출
from flask import request # 클라이언트에서 입력한 정보를 받아옴
from flask_restful import Resource # 입력받은 정보를 자원화
import mysql.connector # DB 연동
from mysql_connection import get_connection # DB 연동 정보를 저장한 사용자 파일

class RecipeListResource(Resource) :
    # restfulAPI의 methods에 해당하는 함수 작성
    def post(self) :
        # api 실행 코드를 여기에 작성
        # 클라이언트에서 body 부분에 작성한 json을 받아오는 코드
        data = request.get_json()
        try :
            # DATA INSERT
            # 1. Connect DB
            connection = get_connection()

            # 2. SQL Query
            query = '''
                    insert into recipe
                        (name, description, cook_time, direction)
                    values
                        ('된장찌개', '맛있는 된장찌개 만드는 방법',
                        '30', '된장을 물에 풀어 야채를 넣고 끓여준다.');
                    '''

            # 3. Get Cursor
            cursor = connection.cursor()

            # 4. Execute Query with cursor
            cursor.execute(query)

            # 5. DATA commit
            connection.commit()

            # 6. Close Resource
            cursor.close()
            connection.close()

		# 입력한 값이 올바르지 않을 경우 에러 출력
        except mysql.connector.Error as e :
            print(e)
            cursor.close()
            connection.close()
            return {"error" : str(e)}, 503 #HTTPStatus.SERVICE_UNAVAILABLE

        # 정상적으로 됐을 때 200, 기본 값이므로 생략 가능
        return {"result" : "success"}, 200

변수로 DB에 값 넣기

  • 1. 변수에 값 정의
  • 2. SQL 쿼리문에서 변수의 값이 필요한 부분에 %s 로 처리
    • %s 는 문자열을 뜻하며, 따옴표(')를 사용하지 않음
  • 3. SQL쿼리문에 들어갈 변수들 튜플화
    • var = (sql_var1, sql_var2...)
    • 변수가 하나 일 경우에는 에러 주의!
      • 변수가 하나 일 경우 쉼표(,)를 해주지 않으면 튜플로 인식하지 않음 -> (sql_va1, )
  • 4. 커서에 SQL 쿼리문을 실행
    • query : SQL 쿼리문의 특정 기능을 수행할 코드를 변수로 저장해둔 것
    • var : SQL 쿼리문에 들어갈 변수의 값을 튜플화해서 변수로 저장해둔 것
      • execute(query, var) : SQL 쿼리문의 필요한 변수를 var에서 순차적으로 읽어서 실행
# RecipeListResource.py

import mysql.connector
from mysql_connection import get_connection

try :
    connection = get_connection()

    name = '순두부'
    description = '맛있는 순두부찌개 만드는 법'
    cook_time = 45 
    direction = '먼저 고기를 볶은후, 물을 넣고, 순두부 넣고 끓인다.'
    query = '''
            insert into recipe
                (name, description, cook_time, direction)
            values
                (%s ,%s ,%s ,%s);
            '''
    record = (name, description, cook_time, direction )
    cursor = connection.cursor()
    cursor.execute(query, record)
    connection.commit()
    cursor.close()
    connection.close()

except mysql.connector.Error as e :
    print(e)

MySQL

DB 값 확인

select * from recipe

반응형