Skip to content

Commit a2b04bc

Browse files
committed
Merge remote-tracking branch 'origin/main'
2 parents 611313f + 3755b84 commit a2b04bc

File tree

4 files changed

+72
-30
lines changed

4 files changed

+72
-30
lines changed

backend/apps/datasource/api/datasource.py

Lines changed: 38 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,21 @@
11
import hashlib
2+
import os
23
import uuid
34
from typing import List
45

56
import pandas as pd
67
from fastapi import APIRouter, File, UploadFile, HTTPException
7-
from numba.core.cgutils import if_zero
88

99
from apps.db.engine import create_table, get_data_engine, insert_data
10-
from common.core.deps import SessionDep
10+
from common.core.deps import SessionDep, CurrentUser
1111
from ..crud.datasource import get_datasource_list, check_status, create_ds, update_ds, delete_ds, getTables, getFields, \
1212
execSql, update_table_and_fields, getTablesByDs, chooseTables, preview
1313
from ..crud.field import get_fields_by_table_id
1414
from ..crud.table import get_tables_by_ds_id
1515
from ..models.datasource import CoreDatasource, CreateDatasource, EditObj, CoreTable
1616

1717
router = APIRouter(tags=["datasource"], prefix="/datasource")
18+
path = "/opt/sqlbot/data/excel"
1819

1920

2021
@router.get("/list")
@@ -28,8 +29,8 @@ async def check(session: SessionDep, ds: CoreDatasource):
2829

2930

3031
@router.post("/add", response_model=CoreDatasource)
31-
async def add(session: SessionDep, ds: CreateDatasource):
32-
return create_ds(session, ds)
32+
async def add(session: SessionDep, user: CurrentUser, ds: CreateDatasource):
33+
return create_ds(session, user, ds)
3334

3435

3536
@router.post("/chooseTables/{id}")
@@ -93,13 +94,17 @@ async def upload_excel(session: SessionDep, file: UploadFile = File(...)):
9394
if not file.filename.lower().endswith(tuple(ALLOWED_EXTENSIONS)):
9495
raise HTTPException(400, "Only support .xlsx/.xls/.csv")
9596

96-
contents = await file.read()
97-
df_sheets = pd.read_excel(contents, sheet_name=None)
98-
# build columns and data to insert db
99-
sheets = []
97+
os.makedirs(path, exist_ok=True)
98+
filename = f"{file.filename.split('.')[0]}_{hashlib.sha256(uuid.uuid4().bytes).hexdigest()[:10]}.{file.filename.split('.')[1]}"
99+
save_path = os.path.join(path, filename)
100+
with open(save_path, "wb") as f:
101+
f.write(await file.read())
102+
100103
conn = get_data_engine()
101-
for sheet_name, df in df_sheets.items():
102-
tableName = f"{sheet_name}_{hashlib.sha256(uuid.uuid4().bytes).hexdigest()[:10]}"
104+
sheets = []
105+
if filename.endswith(".csv"):
106+
df = pd.read_csv(save_path)
107+
tableName = f"sheet1_{hashlib.sha256(uuid.uuid4().bytes).hexdigest()[:10]}"
103108
sheets.append({"tableName": tableName, "tableComment": ""})
104109
column_len = len(df.dtypes)
105110
fields = []
@@ -115,5 +120,27 @@ async def upload_excel(session: SessionDep, file: UploadFile = File(...)):
115120
]
116121
# insert data
117122
insert_data(conn, tableName, fields, data)
123+
else:
124+
df_sheets = pd.read_excel(save_path, sheet_name=None)
125+
# build columns and data to insert db
126+
for sheet_name, df in df_sheets.items():
127+
tableName = f"{sheet_name}_{hashlib.sha256(uuid.uuid4().bytes).hexdigest()[:10]}"
128+
sheets.append({"tableName": tableName, "tableComment": ""})
129+
column_len = len(df.dtypes)
130+
fields = []
131+
for i in range(column_len):
132+
# build fields
133+
fields.append({"name": df.columns[i], "type": str(df.dtypes[i]), "relType": ""})
134+
# create table
135+
create_table(conn, tableName, fields)
136+
137+
data = [
138+
{df.columns[i]: int(row[i]) if "int" in str(df.dtypes[i]) else row[i] for i in range(len(row))}
139+
for row in df.values
140+
]
141+
# insert data
142+
insert_data(conn, tableName, fields, data)
118143
conn.close()
119-
return {"filename": file.filename, "sheets": sheets}
144+
145+
os.remove(save_path)
146+
return {"filename": filename, "sheets": sheets}

backend/apps/datasource/crud/datasource.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,15 @@
99
from apps.db.db import get_engine, get_tables, get_fields, exec_sql
1010
from apps.db.engine import get_engine_config
1111
from apps.db.engine import get_engine_conn
12-
from common.core.deps import SessionDep
12+
from common.core.deps import SessionDep, CurrentUser
1313
from common.utils.utils import deepcopy_ignore_extra
1414
from ..crud.field import delete_field_by_ds_id, update_field
1515
from ..crud.table import delete_table_by_ds_id, update_table
1616
from ..models.datasource import CoreDatasource, CreateDatasource, CoreTable, CoreField, ColumnSchema, EditObj, \
1717
DatasourceConf
1818

1919

20-
def get_datasource_list(session: SessionDep) -> CoreDatasource:
20+
def get_datasource_list(session: SessionDep):
2121
statement = select(CoreDatasource).order_by(CoreDatasource.create_time.desc())
2222
datasource_list = session.exec(statement).fetchall()
2323
return datasource_list
@@ -34,11 +34,12 @@ def check_status(session: SessionDep, ds: CoreDatasource):
3434
return False
3535

3636

37-
def create_ds(session: SessionDep, create_ds: CreateDatasource):
37+
def create_ds(session: SessionDep, user: CurrentUser, create_ds: CreateDatasource):
3838
ds = CoreDatasource()
3939
deepcopy_ignore_extra(create_ds, ds)
4040
ds.create_time = datetime.datetime.now()
4141
# status = check_status(session, ds)
42+
ds.create_by = user.id
4243
ds.status = "Success"
4344
record = CoreDatasource(**ds.model_dump())
4445
session.add(record)
@@ -80,7 +81,6 @@ def delete_ds(session: SessionDep, id: int):
8081
for sheet in conf.sheets:
8182
conn.execute(text(f'DROP TABLE IF EXISTS "{sheet["tableName"]}"'))
8283
conn.commit()
83-
conn.close()
8484

8585
session.delete(term)
8686
session.commit()

frontend/src/views/ds/form.vue

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -189,8 +189,9 @@ const open = (item: any, editTable: boolean = false) => {
189189
if(item.type === 'excel') {
190190
tableList.value = config.value.sheets
191191
} else {
192-
datasourceApi.getTablesByConf(form.value).then((res) => {
193-
tableList.value = res
192+
datasourceApi.getTablesByConf(form.value).then((table) => {
193+
tableList.value = table
194+
checkList.value = checkList.value.filter((ele:string) => {return table.map((ele:any) => {return ele.tableName}).includes(ele)})
194195
})
195196
}
196197
})
@@ -280,20 +281,26 @@ const check = () => {
280281
type: 'success',
281282
showClose: true
282283
})
284+
} else {
285+
ElMessage({
286+
message: 'Connect failed',
287+
type: 'error',
288+
showClose: true
289+
})
283290
}
284291
})
285292
}
286293
287294
const next = async(formEl: FormInstance | undefined) => {
288-
if (form.value.type === "excel") {
289-
// next, show tables
290-
if (excelUploadSuccess.value) {
291-
active.value++
292-
}
293-
} else {
294-
if(!formEl) return
295-
await formEl.validate((valid) => {
296-
if (valid) {
295+
if(!formEl) return
296+
await formEl.validate((valid) => {
297+
if (valid) {
298+
if (form.value.type === "excel") {
299+
// next, show tables
300+
if (excelUploadSuccess.value) {
301+
active.value++
302+
}
303+
} else {
297304
// check status if success do next
298305
buildConf()
299306
datasourceApi.check(form.value).then((res: boolean) => {
@@ -303,11 +310,17 @@ const next = async(formEl: FormInstance | undefined) => {
303310
datasourceApi.getTablesByConf(form.value).then((res) => {
304311
tableList.value = res
305312
})
313+
} else {
314+
ElMessage({
315+
message: 'Connect failed',
316+
type: 'error',
317+
showClose: true
318+
})
306319
}
307320
})
308321
}
309-
})
310-
}
322+
}
323+
})
311324
}
312325
313326
const preview = () => {
@@ -323,7 +336,6 @@ const beforeUpload = (rawFile: any) => {
323336
}
324337
325338
const onSuccess = (response: any) => {
326-
console.log(response)
327339
config.value.filename = response.data.filename
328340
config.value.sheets = response.data.sheets
329341
tableList.value = response.data.sheets

frontend/src/views/ds/index.vue

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<template>
2-
<div>
2+
<div v-loading="loading">
33
<div class="header">
44
<div class="mt-4">
55
<el-input
@@ -72,6 +72,7 @@ const dsForm = ref()
7272
const dsList = ref<any>([])// show ds list
7373
const allDsList = ref<any>([])// all ds list
7474
const router = useRouter()
75+
const loading = ref(false)
7576
7677
const getStatus = (status: string) => {
7778
if (status === 'Success') {
@@ -98,9 +99,11 @@ const refresh = () => {
9899
}
99100
100101
const list = () => {
102+
loading.value = true
101103
datasourceApi.list().then((res) => {
102104
allDsList.value = res
103105
dsList.value = JSON.parse(JSON.stringify(allDsList.value))
106+
loading.value = false
104107
})
105108
}
106109

0 commit comments

Comments
 (0)