pymysql을 통해 쿼리 입력할 때, 아래와 같은 오류 문구를 만나곤 한다.
ValueError: unsupported format character 'Y' (0x59) at index
이는 쿼리의 변수 표현에 쓰이는 %s와 data format 변경하는 (예시에서는 DATE_FORMAT) 에서의 %를 구분해주지 않았기 때문이다.
SELECT DATE_FORMAT(DeviceReportedTime, '%Y-%m-%d %H:%i:%s') AS date, Facility, Priority, FromHost, FromIP, Message FROM SystemEvents WHERE DeviceReportedTime BETWEEN '%s 00:00:00' AND '%s 23:59:59' ORDER BY DeviceReportedTime DESC
위와 같이 작성하면 오류가 발생하는 것이다.
DATE_FORMAT 안의 %를 %%로 변경해주어 아래와 같은 코드로 변경해주자.
SELECT DATE_FORMAT(DeviceReportedTime, '%%Y-%%m-%%d %%H:%%i:%%s') AS date, Facility, Priority, FromHost, FromIP, Message FROM SystemEvents WHERE DeviceReportedTime BETWEEN '%s 00:00:00' AND '%s 23:59:59' ORDER BY DeviceReportedTime DESC
최종 정상 작동 코드 예시
target_date = '2023-12-17'
conn = pymysql.connect(host='666.777.888.999', port=3306, db='sample_DB', user='testuser', passwd='testpassword', charset='utf8')
curdic = conn.cursor(pymysql.cursors.DictCursor)
sql = "SELECT DATE_FORMAT(DeviceReportedTime, '%%Y-%%m-%%d %%H:%%i:%%s') AS date, Facility, Priority, FromHost, FromIP, Message FROM SystemEvents WHERE DeviceReportedTime BETWEEN '%s' AND '%s' ORDER BY DeviceReportedTime DESC"
curdic.execute(sql % (target_date+' 00:00:00', target_date+' 23:59:59'))
get_datas = curdic.fetchall()