Skip to content

Commit 10e3756

Browse files
committed
pref: improve date format display while querying data
1 parent d0bc870 commit 10e3756

File tree

1 file changed

+44
-12
lines changed

1 file changed

+44
-12
lines changed

backend/apps/db/db.py

Lines changed: 44 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,13 @@
33
import os
44
import platform
55
import urllib.parse
6-
from datetime import timedelta
6+
from datetime import datetime, date, time, timedelta
77
from decimal import Decimal
88
from typing import Optional
99

1010
import oracledb
1111
import psycopg2
1212
import pymssql
13-
import re
1413

1514
from apps.db.db_sql import get_table_sql, get_field_sql, get_version_sql
1615
from common.error import ParseSQLResultError
@@ -324,11 +323,14 @@ def get_schema(ds: CoreDatasource):
324323
with get_session(ds) as session:
325324
sql: str = ''
326325
if equals_ignore_case(ds.type, "sqlServer"):
327-
sql = """select name from sys.schemas"""
326+
sql = """select name
327+
from sys.schemas"""
328328
elif equals_ignore_case(ds.type, "pg", "excel"):
329-
sql = """SELECT nspname FROM pg_namespace"""
329+
sql = """SELECT nspname
330+
FROM pg_namespace"""
330331
elif equals_ignore_case(ds.type, "oracle"):
331-
sql = """select * from all_users"""
332+
sql = """select *
333+
from all_users"""
332334
with session.execute(text(sql)) as result:
333335
res = result.fetchall()
334336
res_list = [item[0] for item in res]
@@ -338,15 +340,18 @@ def get_schema(ds: CoreDatasource):
338340
if equals_ignore_case(ds.type, 'dm'):
339341
with dmPython.connect(user=conf.username, password=conf.password, server=conf.host,
340342
port=conf.port, **extra_config_dict) as conn, conn.cursor() as cursor:
341-
cursor.execute("""select OBJECT_NAME from dba_objects where object_type='SCH'""", timeout=conf.timeout)
343+
cursor.execute("""select OBJECT_NAME
344+
from dba_objects
345+
where object_type = 'SCH'""", timeout=conf.timeout)
342346
res = cursor.fetchall()
343347
res_list = [item[0] for item in res]
344348
return res_list
345349
elif equals_ignore_case(ds.type, 'redshift'):
346350
with redshift_connector.connect(host=conf.host, port=conf.port, database=conf.database, user=conf.username,
347351
password=conf.password,
348352
timeout=conf.timeout, **extra_config_dict) as conn, conn.cursor() as cursor:
349-
cursor.execute("""SELECT nspname FROM pg_namespace""")
353+
cursor.execute("""SELECT nspname
354+
FROM pg_namespace""")
350355
res = cursor.fetchall()
351356
res_list = [item[0] for item in res]
352357
return res_list
@@ -355,7 +360,8 @@ def get_schema(ds: CoreDatasource):
355360
password=conf.password,
356361
options=f"-c statement_timeout={conf.timeout * 1000}",
357362
**extra_config_dict) as conn, conn.cursor() as cursor:
358-
cursor.execute("""SELECT nspname FROM pg_namespace""")
363+
cursor.execute("""SELECT nspname
364+
FROM pg_namespace""")
359365
res = cursor.fetchall()
360366
res_list = [item[0] for item in res]
361367
return res_list
@@ -463,8 +469,16 @@ def get_fields(ds: CoreDatasource, table_name: str = None):
463469
return res_list
464470

465471

466-
def convert_value(value):
467-
"""转换值为JSON可序列化的类型"""
472+
def convert_value(value, datetime_format='space'):
473+
"""
474+
将Python值转换为JSON可序列化的类型
475+
476+
:param value: 要转换的值
477+
:param datetime_format: 日期时间格式
478+
'iso' - 2024-01-15T14:30:45 (ISO标准,带T)
479+
'space' - 2024-01-15 14:30:45 (空格分隔,更常见)
480+
'auto' - 自动选择
481+
"""
468482
if value is None:
469483
return None
470484
# 处理 bytes 类型(包括 BIT 字段)
@@ -504,8 +518,26 @@ def convert_value(value):
504518
return str(value) # 或 value.total_seconds()
505519
elif isinstance(value, Decimal):
506520
return float(value)
507-
elif hasattr(value, 'isoformat'): # 处理 datetime/date/time
508-
return value.isoformat()
521+
# 4. 处理 datetime
522+
elif isinstance(value, datetime):
523+
if datetime_format == 'iso':
524+
return value.isoformat()
525+
elif datetime_format == 'space':
526+
return value.strftime('%Y-%m-%d %H:%M:%S')
527+
else: # 'auto' 或其他
528+
# 自动判断:没有时间部分只显示日期
529+
if value.hour == 0 and value.minute == 0 and value.second == 0 and value.microsecond == 0:
530+
return value.strftime('%Y-%m-%d')
531+
else:
532+
return value.strftime('%Y-%m-%d %H:%M:%S')
533+
534+
# 5. 处理 date
535+
elif isinstance(value, date):
536+
return value.isoformat() # 总是 YYYY-MM-DD
537+
538+
# 6. 处理 time
539+
elif isinstance(value, time):
540+
return str(value)
509541
else:
510542
return value
511543

0 commit comments

Comments
 (0)