44import platform
55import urllib .parse
66from decimal import Decimal
7+ from datetime import timedelta
78from typing import Optional
89
910import 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+
450464def 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