From 83d94eedaa8b982cafb61250be786f243122590e Mon Sep 17 00:00:00 2001 From: junjun Date: Fri, 23 May 2025 16:39:29 +0800 Subject: [PATCH] feat(datasource): provide checked tables and fields --- backend/apps/datasource/api/datasource.py | 6 +++--- backend/apps/datasource/crud/datasource.py | 19 ++++++++++++++----- backend/apps/datasource/crud/field.py | 3 ++- backend/apps/datasource/models/datasource.py | 11 ++++++++++- 4 files changed, 29 insertions(+), 10 deletions(-) diff --git a/backend/apps/datasource/api/datasource.py b/backend/apps/datasource/api/datasource.py index d50b4061..1eff12f9 100644 --- a/backend/apps/datasource/api/datasource.py +++ b/backend/apps/datasource/api/datasource.py @@ -12,7 +12,7 @@ from ..crud.datasource import get_datasource_list, check_status, create_ds, upda execSql, update_table_and_fields, getTablesByDs, chooseTables, preview from ..crud.field import get_fields_by_table_id from ..crud.table import get_tables_by_ds_id -from ..models.datasource import CoreDatasource, CreateDatasource, EditObj, CoreTable +from ..models.datasource import CoreDatasource, CreateDatasource, TableObj, CoreTable router = APIRouter(tags=["datasource"], prefix="/datasource") path = "/opt/sqlbot/data/excel" @@ -79,12 +79,12 @@ async def field_list(session: SessionDep, id: int): @router.post("/editLocalComment") -async def edit_local(session: SessionDep, data: EditObj): +async def edit_local(session: SessionDep, data: TableObj): update_table_and_fields(session, data) @router.post("/previewData/{id}") -async def edit_local(session: SessionDep, id: int, data: EditObj): +async def edit_local(session: SessionDep, id: int, data: TableObj): return preview(session, id, data) diff --git a/backend/apps/datasource/crud/datasource.py b/backend/apps/datasource/crud/datasource.py index 87a599a6..c15eac4c 100644 --- a/backend/apps/datasource/crud/datasource.py +++ b/backend/apps/datasource/crud/datasource.py @@ -9,13 +9,13 @@ from apps.datasource.utils.utils import aes_decrypt 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.type import db_type_relation from common.core.deps import SessionDep, CurrentUser from common.utils.utils import deepcopy_ignore_extra from ..crud.field import delete_field_by_ds_id, update_field from ..crud.table import delete_table_by_ds_id, update_table -from ..models.datasource import CoreDatasource, CreateDatasource, CoreTable, CoreField, ColumnSchema, EditObj, \ - DatasourceConf -from apps.db.type import db_type_relation +from ..models.datasource import CoreDatasource, CreateDatasource, CoreTable, CoreField, ColumnSchema, TableObj, \ + DatasourceConf, TableAndFields def get_datasource_list(session: SessionDep): @@ -186,13 +186,13 @@ def sync_fields(session: SessionDep, ds: CoreDatasource, table: CoreTable, field session.commit() -def update_table_and_fields(session: SessionDep, data: EditObj): +def update_table_and_fields(session: SessionDep, data: TableObj): update_table(session, data.table) for field in data.fields: update_field(session, field) -def preview(session: SessionDep, id: int, data: EditObj): +def preview(session: SessionDep, id: int, data: TableObj): ds = session.query(CoreDatasource).filter(CoreDatasource.id == id).first() conf = DatasourceConf(**json.loads(aes_decrypt(ds.configuration))) if ds.type != "excel" else get_engine_config() sql: str = "" @@ -209,3 +209,12 @@ def preview(session: SessionDep, id: int, data: EditObj): ORDER BY "{data.fields[0].field_name}" OFFSET 0 ROWS FETCH NEXT 100 ROWS ONLY""" return exec_sql(ds, sql) + + +def get_tableobj_by_ds(session: SessionDep, id: int) -> List[TableAndFields]: + list: List = [] + tables = session.query(CoreTable).filter(CoreTable.ds_id == id).all() + for table in tables: + fields = session.query(CoreField).filter(and_(CoreField.table_id == table.id, CoreField.checked == True)).all() + list.append(TableAndFields(table=table, fields=fields)) + return list diff --git a/backend/apps/datasource/crud/field.py b/backend/apps/datasource/crud/field.py index eafe3e46..53321575 100644 --- a/backend/apps/datasource/crud/field.py +++ b/backend/apps/datasource/crud/field.py @@ -9,7 +9,8 @@ def delete_field_by_ds_id(session: SessionDep, id: int): def get_fields_by_table_id(session: SessionDep, id: int): - return session.query(CoreField).filter(CoreField.table_id == id).all() + return session.query(CoreField).filter(CoreField.table_id == id).order_by( + CoreField.field_name.asc()).all() def update_field(session: SessionDep, item: CoreField): diff --git a/backend/apps/datasource/models/datasource.py b/backend/apps/datasource/models/datasource.py index 59ef6562..41667d6c 100644 --- a/backend/apps/datasource/models/datasource.py +++ b/backend/apps/datasource/models/datasource.py @@ -55,7 +55,7 @@ class CreateDatasource(BaseModel): # edit local saved table and fields -class EditObj(BaseModel): +class TableObj(BaseModel): table: CoreTable = None fields: List[CoreField] = [] @@ -108,3 +108,12 @@ class ColumnSchema: fieldName: str fieldType: str fieldComment: str + + +class TableAndFields: + def __init__(self, table, fields): + self.table = table + self.fields = fields + + table: CoreTable + fields: List[CoreField]