Restful API

[Restful API] Python MySQL Connector select, 특정 1개 select

건휘맨 2024. 5. 21. 12:39

포스트맨에서 GET 으로 설정하고 URL을 입력

GET과 DELETE는 Body를 설정하지 않는다.

 

중요!!

1. select문은 cursor가져올때 dictionary=True (하지 않으면 튜플 형태로 가져오기 때문에 json 형태가 아님)

2. DB에서 가져온 timestamp는 파이썬에서 datetime으로 자동 변환되는데

    datetime은 json으로 보낼 수 없다.
    따라서 시간을 문자열로 변환해서 보내준다.    

from flask import request
from flask_restful import Resource

from mysql_connection import get_connection
from mysql.connector import Error


class RecipeListResource(Resource):
    
    def get(self):

        # 1. 클라이언트가 보낸 데이터가 있으면 받아준다.
        offset = request.args['offset']
        limit = request.args['limit']

        # 2. DB 로부터 데이터를 가져온다.
        try:
            connection = get_connection()

            query = '''select *
                        from recipe
                        limit '''+offset+''', '''+limit+''';'''
            
            # record = ()

            # 중요!! select문은 cursor가져올때 dictionary=True
            cursor = connection.cursor(dictionary=True)

            cursor.execute(query)

            result_list = cursor.fetchall()

            print(result_list)
            # 중요!! DB에서 가져온 timestamp는 파이썬에서 datetime으로 자동 변환되는데 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

            print()
            print(result_list)

            cursor.close()
            connection.close()
            
        except Error as e:
            if cursor is not None:
                cursor.close()
            if connection is not None:
                connection.close()
            return {'result' : 'fail', 'error' : str(e)}, 500

        # 3. 클라이언트에 json 만들어서 응답한다.

        return {'items' : result_list,
                'count' : len(result_list),
                'result' : 'success'}
 

Vscode 에서 터미널 > flask run 으로 서버 실행한 후

포스트맨에서 Send 하고 상태 코드가 200 OK인지 확인, success 인지 확인

 

 

 

특정 1개만 select

 

특정한 경로로 들어오는 요청에 대해 특정 아이디를 받아 처리하는 클래스를 만들고, 그에 맞는 경로를 설정

 

경로 설정

from flask import Flask
from flask_restful import Api

from resources.recipe import RecipeListResource, RecipeResource

app = Flask(__name__)
api = Api(app)

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

api.add_resource(RecipeResource, '/recipes/<int:recipe_id>')
# <int:recipe_id> 부분은 사용자가 요청하는 특정 레시피의 ID를 나타낸다.
# 예를 들어, /recipes/1로 요청하면 ID가 1인 레시피의 정보를 반환합니다.

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

 

 

새로운 클래스를 만들어서 해당 클래스에 요청을 처리하는 코드 작성

 

중요!!

튜플에 항목이 하나만 들어갈 때에도 뒤에 쉼표(,)를 붙여줘야한다.

class RecipeResource(Resource):
	
    def get(self, recipe_id):

        # 1. 클라이언트로부터 데이터를 받는다.
        print(recipe_id)

        # 2. DB 로 부터 데이터를 가져온다.
        try:
            connection = get_connection()
            query = '''select *
                        from recipe
                        where id = %s;'''
            # 중요!!
            # 튜플에 항목이 하나만 들어갈 때에도 뒤에 쉼표(,)를 붙여줘야한다.
            record = (recipe_id, )
            cursor = connection.cursor(dictionary=True)
            cursor.execute(query, record)
            result_list = cursor.fetchall()
            print(result_list)

            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:
            if cursor is not None:
                cursor.close()
            if connection is not None:
                connection.close()
            return {"result" : "fail", 
                    "error" : str(e)}, 500      

        # 3. 응답할 데이터를 JSON 으로 만든다.
        # 데이터베이스에 없는 recipe_id를 경로로 지정했다면
        # 해당 아이디가 존재하지 않음을 알려주는 조건문을 추가
        if len(result_list) == 1:
            return {"item" : result_list[0],
                    "result" : "success"}        
        else:
            return{"result" : "fail",
                    "error" : "해당 아이디는 존재하지 않습니다."}, 400

 

 

데이터베이스에 없는 recipe_id를 경로로 지정한 경우