python pymysql을 이용하여 database에 있는 datetime type의 data를 가져올 때 문제점이 있습니다. 바로 mysql에 있는 값이 가져오면 python에서는 tuple으로 변하게 됩니다. 아래를 참고 하시기 바랍니다.
database : 2020-11-20 15:17:37
python : datetime.datetime(2020, 11, 20, 15, 17, 37)
이렇게 이상한 tuple형식으로 반환하는 이유는 python의 기본 json 인코더가 모든 종류의 데이터베이스 쿼리에서 흔히 볼 수있는 자체 datetime 유형을 지원하지 않고 있기 때문에 위와 같은 상황이 발생합니다. 물론 strftime() 함수를 이용하여 아래와 같이 손쉽게 해당 데이터를 불러 올 때 string화 해주는 방법도 있습니다.
SELECT strftime('%H %M %S %s','now');
하지만 매번 datetime type의 data를 가져올 때 마다 작성하면 불편하기 때문에, python flask에서 지원해주는 JSONEncoder를 이용하면, json형식을 가져올 때 특정 type의 형태를 customizing을 할 수 있습니다.
import decimal
import datetime
from flask.json import JSONEncoder
class CustomJSONEncoder(JSONEncoder):
def default(self, obj):
if isinstance(obj, decimal.Decimal):
return float(obj)
if isinstance(obj, datetime.datetime):
return obj.strftime('%Y-%m-%d %H:%M:%S')
return JSONEncoder.default(self, obj)
def create_app():
app = Flask(__name__)
app.json_encoder = CustomJSONEncoder