Python 查詢Mysql,如果是datetime類型,在json序列化的時候會出現問題。
在網上查了一下,解決方案基本都是遍歷dict數據,如果是datetime則轉化為字符串。
from datetime import date, datetime def json_serial(obj): """JSON serializer for objects not serializable by default json code""" if isinstance(obj, (datetime, date)): serial = obj.isoformat() return serial raise TypeError ("Type %s not serializable" % type(obj))
由於我的數據量很大,后台做循環再返回前端,響應將近40s,十分頭疼。
據說使用json_dump方法可以處理這個問題,但是在我這沒起作用。
from bson import json_util import json json.dumps(anObject, default=json_util.default)
解決思路:
想了一下,覺得不如從MySQL下手,讓MySQL返回string的數據類型。在SQL引擎下做數據處理,肯定比自己for處理要效率的多。
MySQL做數據類型轉換的函數是CAST。於是將SQL語句變成:
SELECT country, CAST(date AS CHAR) AS date, peak FROM table_peak WHERE date < '2015-05-01' GROUP BY date, country
改過之后,響應時間直接變成了10s。考慮到數據有9.1M,算下來速度也有800kb/s。這樣一來,網絡速度才是主要的效率瓶頸了,數據處理的時間可以忽略不計。
叨叨:
在這之前,其實可以想一下,為什么Python能自動識別日期格式的數據並將其轉化為datetime?
我猜原因是MySQL返回數據時,會同時返回數據類型標識,底層驅動監測到數據類型之后,再將數據類型轉換為各種語言下對應的數據。如在Python中,date類型就被轉成了對應的datetime類型。
既然這樣,直接在查詢的時候,指定給我返回字符串類型的數據就好了。這樣就不會存在驅動轉換數據類型的問題。