feat: field enum

This commit is contained in:
junjun
2025-07-16 14:24:55 +08:00
parent 4f58eb531c
commit 89a5909c7d
3 changed files with 49 additions and 3 deletions
+6 -1
View File
@@ -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"}
+19 -2
View File
@@ -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)
+24
View File
@@ -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}")