Flask

API서버 - MySQL Connector 를 이용해서 select 하기 (GET)

yugyeong 2023. 1. 4. 17:57

MySQL Connector 를 이용해 select 하는 방법

 

1. API 서버 구축

메인 파일 app.py

# app.py
from flask import Flask
from flask_restful import Api
from resources.recipe import RecipeListResource

app = Flask(__name__)

api = Api(app)

# 경로와 리소스(api코드) 연결
api.add_resource(RecipeListResource, '/recipes')
api.add_resource(RecipeResource, '/recipes/<int:recipe_id>')

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

 

2. 기능 설계

1. 전체 데이터 가져오기

  • select 하여서 전체 데이터를 가져온다.
  • select 문에서는 커서를 가져올 때, dictionary = True 로 설정을 해주어야한다.
  • DB에서 가져온 timestamp 형태는 파이썬에서 datetime 으로 자동 변환된다.
  • 데이터를 json 으로 클라이언트에게 보내줘야하기 때문에, 시간을 문자열로 변환하여서 보내주는 코드도 작성을 하여야한다.
  • select 문을 이용하여서 리스트 형태의 데이터를 가져올 때에는 cursor.fetchall() 을 이용하여야 한다.

 

# get 메소드를 처리하는 함수를 만든다
    def get(self) :
        # 1. 클라이언트로부터 데이터를 받아온다.
        # 없다.

        # 2. 디비에 저장된 데이터를 가져온다.
        try :
            connection = get_connection()

            query = '''select *
                    from recipe;'''


            ## 중요!! select 문은,
            ## 커서 가져올 때, dictionary= True 로 해준다.
            cursor = connection.cursor(dictionary= True)

            # 커서 실행
            cursor.execute(query)

	  # 리스트 형태의 데이터를 가져올 때는 fetchall()을 이용한다
            result_list = cursor.fetchall()

            print(result_list)

            # 중요! 디비에서 가져온 timestamp 는 
            # 파이썬에서 datetime 으로 자동 변환된다.
            # 그런데 문제는, 우리는 json 으로 
            # 클라이언트한테 데이터를 보내줘야 하는데,
            # datetime 은 json 으로 보낼 수 없다.
            # 따라서, 시간을 문자열로 변환해서 보내준다.
            i = 0
            for row in result_list :
                result_list[i]['created_at'] = row['created_at'].isoformat()
                result_list[i]['updated_at'] = row['updated_at'].isoformat()
                i = i + 1


            cursor.close()
            connection.close()

        except Error as e :
            print(e)
            cursor.close()
            connection.close()
            return {"result" : "fail", "error" : str(e)}, 500
        
        return {"result" : "success", "items" : result_list, "count" : len(result_list)} , 200


class RecipeResource(Resource) :

 

 

2. 특정 데이터만 가져오기

def get(self, recipe_id) :
        # 1. 클라이언트로부터 정보를 가져온다.
        print(recipe_id)

        # 2. 디비로부터 해당 레시피 아이디에 맞는 
        #    레시피 데이터를 가져온다.

        try :
            connection = get_connection()

            query = '''select *
                    from recipe
                    where id = %s;'''

            # 변수처리 , 튜플형식으로
            record = (recipe_id, )

            # 쿼리에서 select 하는 문장은 파라미터 dictionary= True 로 설정
            cursor = connection.cursor(dictionary= True)
            # 커서를 실행하라는 코드
            cursor.execute(query, record)
            # 커서를 가져오는 코드
            result_list = cursor.fetchall()

            i = 0
            for row in result_list :
                result_list[i]['created_at'] = row['created_at'].isoformat()
                result_list[i]['updated_at'] = row['updated_at'].isoformat()
                i = i + 1

            cursor.close()
            connection.close()

        except Error as e :
            print(e)
            cursor.close()
            connection.close()
            return {"result" : "fail", "error" : str(e)}, 500


        if len(result_list) == 0 :
            return {"result" : "fail", "message" : "데이터가 없습니다."}, 400

        return {"result" : "success", "item" : result_list[0]}, 200

 

 

3. postman 에서 API 기능 테스트

GET 으로 설정하고 send 를 하면 전체 데이터를 가져온다.

 

특정 데이터만 가져오도록 할 때에는, query string 부분만 수정하면 된다.