python execute() 메소드 예제
본문 바로가기

Backend

python execute() 메소드 예제

추가

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에 각각 할당된다!

반응형