API 서버개발

API 서버개발 - Python MySQL을 이용해 insert 하는 방법

isk03300 2023. 12. 6. 10:58

 

오늘은 python mysql을 이용하여 API에서 리퀘스트를 받아 데이터베이스로 insert 하는 방법을 알아보려 한다.

 

 

레시피 데이터로 예제를 작성 해보았다. 

class RecipeListResource(Resource) :
    
    # http Method 와 동일한 함수명으로 오버라이딩!
    def post(self) :

        
        # 1. 클라이언트가 보내준 데이터가 있으면, 그 데이터를 먼저 받아준다.
        data = request.get_json()

        print(data)
        # 2. 받아온 레시피 데이터를 DB에 저장해야 한다.

 

 

후엔 try와 except문을 작성하여 각각의 변수를 지정해준 뒤 query 변수에 mysql에서 작성한 쿼리문을 가져온다.

후엔 recode엔 insert할 데이터의 컬럼 값 지정을 위해 데이터베이스 테이블의 컬럼 순서대로 입력을 해준 뒤,

cursor.excute() 안에 담아준다.

해당 query 변수에 sql 컬럼 명이 insert 되어야 API에서 insert한 값이 데이터베이스로 저장이 된다.

이렇게 코드를 작성한 후 API에서 원하는 값의 데이터를 insert 하면  mysql workbench 데이터베이스로 저장이 되는 모습을 확인할 수 있을 것이다.

try :
            # 2-1. DB에 연결하는 코드
            conncetion = get_connection()

            # 2-2. 쿼리문 만들기 - insert
            query = '''insert into recipe
                        (name, description, num_of_servings,
                        cook_time, directions)
                        values
                        (%s, %s, %s,%s,%s);'''
            # 2-3. 위의 쿼리에 매칭되는 변수를 처리해 준다.
            # 단, 라이브러리 특성상, 튜플로 만들어야 한다.
            record = ( data['name'] , data['description'] ,
                      data['num_of_servings'] , data['cook_time'],
                      data['directions'])
            
            # 2-4. 커서를 가져온다.
            cursor = conncetion.cursor()

            # 2-5. 위의 쿼리문을, 커서로 실행한다.
            cursor.execute(query, record)

            # 2-6. 커밋해줘야, DB에 완전히 반영된다.
            conncetion.commit()

            # 2-7. 자원해제
            cursor.close()
            conncetion.close()

        except Error as e :
            print(e)
            cursor.close()
            conncetion.close()

            # 유저한테도 알려줘야 한다. => response 해준다
            return {"result" : "fail", "error" :str(e) }, 500

        # 3. DB에 잘 저장 되었으면, 클라이언트에게 응답 해준다.
        #    보내줄 정보(json) 과 http 상태코드를 리턴한다.

        return {"result" :"success"}, 200

 

 

이상으로 오늘의 포스팅을 마치겠습니다.