추가
sql문이 아니라 db상의 프로시져를 호출할경우 %s가 안먹히고 에러가남. 그래서 이때는 그냥 {파라미터}로 처리함
---
c언어에서도 비슷한애가 있다고하는데 변수명이 선언된애들로 순차적으로 할당됨. 마치 파이썬의 서식과 숫자의 대응과 비슷해보이는데..
money = 10
money2 = 20
printf("오늘은 %d + %d 달러만큼 돈을 썼습니다.",money,money2)
sql = (
"INSERT INTO Project.Movie (MId, Title) "
"VALUES (%s, %s)"
)
data = (21,'aman')
cursor.execute(sql, data)
실전 예제
from app.models import connect_database
def query_statis(statis_type, start_date, end_date, member_qr_no):
""" 주어진 파라미터들에 방문자 통계를 조회하여 반환합니다.
Args:
statis_type ([string]): 통계 형식 ; "hourly" = 시간대별 통계, "daily" = 일별 통계
start_date ([string]): 방문자 통계의 조회 시작일 ; yyyy-mm-dd
end_date ([string]): 방문자 통계의 조회 종료일 ; yyyy-mm-dd
Returns:
[dict]: API 결과 형식의 dict 객체 = { 'resultCode': 200, 'resultMsg': 'success', 'resultData': [] }
"""
database = connect_database()
connection = None
cursor = None
rows = None
if database == None:
# 데이터베이스 연결 실패 오류 처리 필요
return { 'resultCode':500, 'resultMsg': 'database engine fail!' }
try:
connection = database.raw_connection()
except:
return { 'resultCode':500, 'resultMsg': 'database connection fail!' }
try:
cursor = connection.cursor() # get DISPENSER_V2 mariadb cursor
except:
return { 'resultCode':500, 'resultMsg': 'database cursor fail!' }
query = f"""
SELECT
DATE_FORMAT(reg_date, '%Y-%m-%d') AS reg_date
, CAST(SUM(query_count) AS INT) AS query_count
, CAST(SUM(visit_count) AS INT) AS visit_count
FROM QR_HISTORY AS Q
WHERE 1 = 1
AND member_qr_no = %s
AND reg_date BETWEEN %s AND DATE_ADD(%s, INTERVAL 1 DAY)
GROUP BY DATE_FORMAT(reg_date, '%Y-%m-%d')
ORDER BY reg_date ASC
; """
if statis_type == "hourly":
query = f"""
SELECT
DATE_FORMAT(reg_date, '%Y-%m-%d %H:00') AS reg_date
, query_count
, visit_count
FROM QR_HISTORY AS Q
WHERE 1 = 1
AND member_qr_no = %s
AND reg_date BETWEEN %s AND DATE_ADD(%s, INTERVAL 1 DAY)
ORDER BY reg_date ASC
;"""
try:
cursor.execute(query, (member_qr_no, start_date, end_date))
except:
return { 'resultCode':500, 'resultMsg': 'query execution fail : statis list' }
result = [dict((cursor.description[i][0], value) for i, value in enumerate(row)) \
for row in cursor.fetchall()]
return { 'resultCode': 200, 'resultMsg': 'success', 'resultData': result }
cursor.execute(query, (member_qr_no, start_date, end_date))
cursor객체가 실행될때 쿼리문에서 %s들은 변수명인 member_qr_no, start_date, end_date에 각각 할당된다!
반응형
'Backend' 카테고리의 다른 글
[flask 기초2] SQLAlchemy (0) | 2021.07.16 |
---|---|
[python] form 태그로 직접 insert를 해보자 (0) | 2021.07.14 |
[오류][해결] attributeerror 'nonetype' object has no attribute 'get' (0) | 2021.07.07 |
파이썬 빠른테스트 (0) | 2021.07.07 |
[flask] mvc패턴에따른 딕셔너리 활용 (0) | 2021.06.28 |