본문 바로가기
API/MySQL API

Python으로 Mysql접속, 영화리스트 가져오는 API

by 하니__ 2024. 5. 27.

 

 

 

 

이런 페이지를 만들어야 한다면

 

우선 로그인이 되어 있어야 한다,

즐겨찾기 구분을 해줘야하고,

 

영화 이름 정보를 가져와야하고,

리뷰 갯수 토탈과, 별점 평균을 구해야하고

 

옾셋, 리밋 25로 설정한 것으로

 

리뷰로 정렬한 페이지

별점으로 정렬한 페이지

 

를 만들면 되겠다

 

API 설정

 

HTTP 메소드는

CRUD중 Read에 해당하는

GET로 설정후

 

offset과 limit을 설정

정렬에 해당하는 order는 리뷰갯수로 일단 설정후

 

나중에 별점평균으로 설정하고 싶다면 바꾸라는 메세지를 추가로 작성해준다

 

app.py 설정
api.add_resource(MovieResources, '/movie')

경로 설정해주고 다음으로 넘어간다

 

movie.py 설정

 

class MovieResources(Resource) : 
    
    @jwt_required()
    def get(self):
        offset = request.args['offset']
        limit = request.args['limit']
        order = request.args.get['order']
        
        user_id = get_jwt_identity()

 

 

클래스를 입력해주고

회원정보가 필요하니

jwt_required를 작성

그리고 get 함수로 설정

 

그리고 경로? 이후로 설정되어있는 주소에서 가져올 정보를

리퀘스트 겟으로 가져오고

 

유저 아이디도 jwt 토큰으로 가져온다

 

DB연결, 쿼리문 작성
try:
    connection = get_connection()

    query = '''select m.id, m.title,
                    count(r.id) as reviewCnt,
                    ifnull( avg(r.rating), 0 ) as avgRating,
                    if( f.id is null , 0 ,1) as isFavorite
                from movie m
                left join review r
                    on m.id = r.movieId
                left join favorite f
                    on m.id = f.movieId and f.userId = %s
                group by m.id
                order by '''+ order +''' desc
                limit '''+ offset +''', '''+ limit +''';'''
    record = (user_id, )

 

 

 

 

쿼리문은 이전에 작성해둔게 있어 copy&paste 하고

정렬 부분의 order와

페이징의 offset과 limit은 변수처리 할 수 있게

문자열로 처리 해준다

 

커서 사용, 해제, 에러상황 대처
	cursor = connection.cursor(dictionary=True)
        cursor.execute(query, record)
        result_list = cursor.fetchall()
        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

 

 

그 후 커서 사용과 해제, 에러처리 문구를 적고

 

 

파일형식 변환 및 클라이언트에게 JSON으로 리턴
i = 0
for row in result_list :
    result_list[i]['avgRating'] = float(row['avgRating'])
    i = i + 1

return{"result" : "success",
       "item" : result_list,
       "cnt" : len(result_list)}

 

결과를 클라이언트에게 보여주기 전에

별점 평균을 나타내고 있는 타입이

decimal 타입인데

 

이 형식은

MySQL에서 고정 소수점 타입인데

이 형식이 json으로는 처리 할 수 없어서 

float으로의 변환이 필요하다

 

그렇기에 반복문을 이용하여 별점평균의 행을 모두 float으로 변환후에

결과를 보여주도록 하자