文章目錄
- 前言
- 一、查詢SQL語句中數據轉換
- 1、思路
- 2、示例
- 3、常用格式化模式
- 4、注意事項
- 二、自定義JSONEncoder處理
- 1、思路
- 2、示例
- 3、使用方法
- 寫在結尾
前言
??使用Python
開發查詢PostgreSQL
數據庫,返回數據中有timestamp
類型數據字段。如果使用json.dumps
轉換成json
對象,可能會遇到:“TypeError: Object of type datetime is not JSON serializable
”錯誤,大概意思是datetime.datetime不可JSON序列化。
??數據庫字段定義:
"file_date" timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP
??使用print將查詢后元組中的值打印出來,發現timestamp類型的數據是以對象的形式存在的,如:datetime.datetime(2025, 6, 24, 11, 45, 36, 11746)
。
??本文嘗試在不改動數據庫的情況下記錄幾種解決方法。
一、查詢SQL語句中數據轉換
1、思路
??從數據源頭處理,PostgreSQL
中直接查詢timestamp
類型數據到元組中表現為對象,那就從查詢語句著手,在查詢的SQL
語句中將數據轉換成字符串格式數據。
??在PostgreSQL
中,可以使用TO_CHAR
函數將日期格式化為多種不同的格式。TO_CHAR
函數接受兩個參數:一個是要格式化的日期值,另一個是定義輸出格式的模板。
2、示例
SELECT TO_CHAR("file_date", 'YYYY-MM-DD HH24:MI:SS');
??上述示例將當前時間格式化為 YYYY-MM-DD HH24:MI:SS
格式。
3、常用格式化模式
YYYY
:四位數年份MM
:兩位數月份(01-12)DD
:兩位數日期(01-31)HH24
:24小時制的小時(00-23)MI
:分鐘(00-59)SS
:秒(00-59)
4、注意事項
- 日期插入:推薦使用
ISO
格式YYYY-MM-DD
插入日期值。 - 錯誤處理:如果插入的日期格式不正確,可能會導致錯誤。例如,‘16-10-2022’ 會導致錯誤,因為數據庫無法確定哪個字段是日期,哪個字段是月份。
- 通過使用
TO_CHAR
函數和適當的格式化模式,可以靈活地在PostgreSQL
中處理和顯示日期。
二、自定義JSONEncoder處理
1、思路
??通過Python
中的json
模塊。json.dumps()
是一個把Python
對象轉換成json
字符串的函數。如下:
json.dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True,allow_nan=True, cls=None, indent=None, separators=None,default=None, sort_keys=False, **kw)
??其中的cls
參數允許自定義JSONEncoder
的派生類,覆蓋其中的default()
方法實現序列化其他類型的數據。
2、示例
from datetime import datetime
import jsonclass DateTimeEncoder(json.JSONEncoder):def default(self, o):if isinstance(o, datetime):return o.isoformat()return super().default(o)
3、使用方法
data = (1, 'c7ffc2fc7e9182e649e3cae0d9e8bf98', 0, datetime.datetime(2025, 6, 24, 11, 45, 36, 11746), None)
json.dumps(data, ensure_ascii=False, cls=DateTimeEncoder)
寫在結尾
??疑云盤詰久徘徊,忽見天光破霧來。解惑明心皆朗徹,故有此文以記之!