Skip to content

Commit d362df9

Browse files
committed
fix: add JSON serialization support for timedelta objects
1 parent cdb9f89 commit d362df9

File tree

1 file changed

+26
-18
lines changed

1 file changed

+26
-18
lines changed

backend/apps/db/db.py

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import platform
55
import urllib.parse
66
from decimal import Decimal
7+
from datetime import timedelta
78
from typing import Optional
89

910
import oracledb
@@ -447,6 +448,19 @@ def get_fields(ds: CoreDatasource, table_name: str = None):
447448
return res_list
448449

449450

451+
def convert_value(value):
452+
"""转换值为JSON可序列化的类型"""
453+
if isinstance(value, timedelta):
454+
# 将 timedelta 转换为秒数(整数)或字符串
455+
return str(value) # 或 value.total_seconds()
456+
elif isinstance(value, Decimal):
457+
return float(value)
458+
elif hasattr(value, 'isoformat'): # 处理 datetime/date/time
459+
return value.isoformat()
460+
else:
461+
return value
462+
463+
450464
def exec_sql(ds: CoreDatasource | AssistantOutDsSchema, sql: str, origin_column=False):
451465
while sql.endswith(';'):
452466
sql = sql[:-1]
@@ -459,9 +473,8 @@ def exec_sql(ds: CoreDatasource | AssistantOutDsSchema, sql: str, origin_column=
459473
columns = result.keys()._keys if origin_column else [item.lower() for item in result.keys()._keys]
460474
res = result.fetchall()
461475
result_list = [
462-
{str(columns[i]): float(value) if isinstance(value, Decimal) else value for i, value in
463-
enumerate(tuple_item)}
464-
for tuple_item in res
476+
{str(columns[i]): convert_value(value) for i, value in enumerate(tuple_item)} for tuple_item in
477+
res
465478
]
466479
return {"fields": columns, "data": result_list,
467480
"sql": bytes.decode(base64.b64encode(bytes(sql, 'utf-8')))}
@@ -480,9 +493,8 @@ def exec_sql(ds: CoreDatasource | AssistantOutDsSchema, sql: str, origin_column=
480493
field in
481494
cursor.description]
482495
result_list = [
483-
{str(columns[i]): float(value) if isinstance(value, Decimal) else value for i, value in
484-
enumerate(tuple_item)}
485-
for tuple_item in res
496+
{str(columns[i]): convert_value(value) for i, value in enumerate(tuple_item)} for tuple_item in
497+
res
486498
]
487499
return {"fields": columns, "data": result_list,
488500
"sql": bytes.decode(base64.b64encode(bytes(sql, 'utf-8')))}
@@ -499,9 +511,8 @@ def exec_sql(ds: CoreDatasource | AssistantOutDsSchema, sql: str, origin_column=
499511
field in
500512
cursor.description]
501513
result_list = [
502-
{str(columns[i]): float(value) if isinstance(value, Decimal) else value for i, value in
503-
enumerate(tuple_item)}
504-
for tuple_item in res
514+
{str(columns[i]): convert_value(value) for i, value in enumerate(tuple_item)} for tuple_item in
515+
res
505516
]
506517
return {"fields": columns, "data": result_list,
507518
"sql": bytes.decode(base64.b64encode(bytes(sql, 'utf-8')))}
@@ -518,9 +529,8 @@ def exec_sql(ds: CoreDatasource | AssistantOutDsSchema, sql: str, origin_column=
518529
field in
519530
cursor.description]
520531
result_list = [
521-
{str(columns[i]): float(value) if isinstance(value, Decimal) else value for i, value in
522-
enumerate(tuple_item)}
523-
for tuple_item in res
532+
{str(columns[i]): convert_value(value) for i, value in enumerate(tuple_item)} for tuple_item in
533+
res
524534
]
525535
return {"fields": columns, "data": result_list,
526536
"sql": bytes.decode(base64.b64encode(bytes(sql, 'utf-8')))}
@@ -538,9 +548,8 @@ def exec_sql(ds: CoreDatasource | AssistantOutDsSchema, sql: str, origin_column=
538548
field in
539549
cursor.description]
540550
result_list = [
541-
{str(columns[i]): float(value) if isinstance(value, Decimal) else value for i, value in
542-
enumerate(tuple_item)}
543-
for tuple_item in res
551+
{str(columns[i]): convert_value(value) for i, value in enumerate(tuple_item)} for tuple_item in
552+
res
544553
]
545554
return {"fields": columns, "data": result_list,
546555
"sql": bytes.decode(base64.b64encode(bytes(sql, 'utf-8')))}
@@ -553,9 +562,8 @@ def exec_sql(ds: CoreDatasource | AssistantOutDsSchema, sql: str, origin_column=
553562
field in
554563
columns]
555564
result_list = [
556-
{str(columns[i]): float(value) if isinstance(value, Decimal) else value for i, value in
557-
enumerate(tuple(tuple_item))}
558-
for tuple_item in res
565+
{str(columns[i]): convert_value(value) for i, value in enumerate(tuple_item)} for tuple_item in
566+
res
559567
]
560568
return {"fields": columns, "data": result_list,
561569
"sql": bytes.decode(base64.b64encode(bytes(sql, 'utf-8')))}

0 commit comments

Comments
 (0)