diff --git a/backend/apps/datasource/api/datasource.py b/backend/apps/datasource/api/datasource.py index b0921673..6e2761f5 100644 --- a/backend/apps/datasource/api/datasource.py +++ b/backend/apps/datasource/api/datasource.py @@ -9,7 +9,7 @@ from fastapi import APIRouter, File, UploadFile, HTTPException from apps.db.engine import create_table, get_data_engine, insert_data from common.core.deps import SessionDep, CurrentUser from ..crud.datasource import get_datasource_list, check_status, create_ds, update_ds, delete_ds, getTables, getFields, \ - execSql, update_table_and_fields, getTablesByDs, chooseTables, preview, updateTable, updateField, get_ds + execSql, update_table_and_fields, getTablesByDs, chooseTables, preview, updateTable, updateField, get_ds, fieldEnum from ..crud.field import get_fields_by_table_id from ..crud.table import get_tables_by_ds_id from ..models.datasource import CoreDatasource, CreateDatasource, TableObj, CoreTable, CoreField @@ -103,6 +103,11 @@ async def edit_local(session: SessionDep, id: int, data: TableObj): return preview(session, id, data) +@router.post("/fieldEnum/{id}") +async def field_enum(session: SessionDep, id: int): + return fieldEnum(session, id) + + @router.post("/uploadExcel") async def upload_excel(session: SessionDep, file: UploadFile = File(...)): ALLOWED_EXTENSIONS = {"xlsx", "xls", "csv"} diff --git a/backend/apps/datasource/crud/datasource.py b/backend/apps/datasource/crud/datasource.py index 9430a79f..f2a31b82 100644 --- a/backend/apps/datasource/crud/datasource.py +++ b/backend/apps/datasource/crud/datasource.py @@ -9,9 +9,9 @@ from sqlbot_xpack.permissions.models.ds_rules import DsRules from sqlmodel import select from apps.datasource.utils.utils import aes_decrypt +from apps.db.constant import DB from apps.db.db import get_engine, get_tables, get_fields, exec_sql -from apps.db.engine import get_engine_config -from apps.db.engine import get_engine_conn +from apps.db.engine import get_engine_config, get_engine_conn from apps.db.type import db_type_relation from common.core.deps import SessionDep, CurrentUser from common.utils.utils import deepcopy_ignore_extra @@ -245,6 +245,23 @@ def preview(session: SessionDep, id: int, data: TableObj): return exec_sql(ds, sql) +def fieldEnum(session: SessionDep, id: int): + field = session.query(CoreField).filter(CoreField.id == id).first() + if field is None: + return [] + table = session.query(CoreTable).filter(CoreTable.id == field.table_id).first() + if table is None: + return [] + ds = session.query(CoreDatasource).filter(CoreDatasource.id == table.ds_id).first() + if ds is None: + return [] + + db = DB.get_db(ds.type) + sql = f"""SELECT DISTINCT {db.prefix}{field.field_name}{db.suffix} FROM {db.prefix}{table.table_name}{db.suffix}""" + res = exec_sql(ds, sql) + return [item.get(res.get('fields')[0]) for item in res.get('data')] + + def updateNum(session: SessionDep, ds: CoreDatasource): all_tables = get_tables(ds) selected_tables = get_tables_by_ds_id(session, ds.id) diff --git a/backend/apps/db/constant.py b/backend/apps/db/constant.py new file mode 100644 index 00000000..51126272 --- /dev/null +++ b/backend/apps/db/constant.py @@ -0,0 +1,24 @@ +# Author: Junjun +# Date: 2025/7/16 + +from enum import Enum + + +class DB(Enum): + mysql = ('mysql', '`', '`') + sqlServer = ('sqlServer', '[', ']') + pg = ('pg', '"', '"') + excel = ('excel', '"', '"') + oracle = ('oracle', '"', '"') + + def __init__(self, type, prefix, suffix): + self.type = type + self.prefix = prefix + self.suffix = suffix + + @classmethod + def get_db(cls, type): + for db in cls: + if db.type == type: + return db + raise ValueError(f"Invalid db type: {type}")