gologiusの巣

プログラミングなどの技術メモです。誰かの役に立てるとうれしいです。

MySQL+Python(Flask) でdatetimeが返却される

MySQLのDATETIME型を、SELECT文で取得すると、 pythonのdatetime型で返却される事象があるようです。

私も下記記事のようになりました

Python - PythonでMySQLのTIME型をSELECTする方法|teratail

例コード

import mysql.connector
DB_HOST = "192.168.0.XXX"
DB_NAME = "your_db_name"
DB_USER = "your_db_user"
DB_PW = "your_user_pw"
conn = mysql.connector.connect(user=DB_USER, password=DB_PW, host=DB_HOST, database=DB_NAME)

cur = conn.cursor(dictionary=True) #引数指定すると、辞書型で返してくれる
sql = "SELECT ADD_DATE FROM USER;"
cur.execute(sql)
data = cur.fetchall(); 

print(data)

>>[ { "ADD_DATE": datetime.datetime(2019, 08, 08) } ]

ちなみに、APIを実装するために、Flaskの関数 flask.jsonify() なんかでJSON変換して送信すると、 文字列がMon Mar 22 05:06:07 GMT 1999 のようになってしまう。

素直にYYYYMMDD hh:mm:ss で表示してほしい・・・

解決方法

MySQLならDATE_FORMAT関数があるので、そちらを使ってフォーマットされた文字列を出力する。

ただしそのままSELECTすると、Pythonで結果をfetchする際に、辞書型のキー名がDATE_FORMAT(****)になっていまいます。

なので、SQL文を

sql = 'SELECT DATE_FORMAT(ADD_DATE, %s) AS ADD_DATE  FROM USER;'
cur.execute(sql, ('%Y年%m月%d日 %h時%i分%s秒',))

のようにASを使用してあげるとよいと思います。

ダメな例

なお、Pythonパッケージmysql-connector-pythonを使用する場合、 リファレンス通りのSQLを作るとエラーになります。

MySQL :: MySQL 5.6 リファレンスマニュアル :: 12.7 日付および時間関数

NG例

sql = 'SELECT  DATE_FORMAT(LAST_UPDATE_DATE,'%Y年%m月%d日 %h時%i分%s秒') FROM USER;"'
cur.execute(sql)

恐らくSQL Statementで使用する'%'がエラーで引っかかるのだと思います。

Use mysql DATE_FORMAT in Python - CodeProject

以上