Skip to content

Commit cb1180e

Browse files
committed
feat(datasource): Support csv
1 parent 7786ff1 commit cb1180e

File tree

3 files changed

+49
-23
lines changed

3 files changed

+49
-23
lines changed

backend/apps/datasource/api/datasource.py

Lines changed: 35 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
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
1010
from common.core.deps import SessionDep
@@ -15,6 +15,7 @@
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")
@@ -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: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,6 @@ def delete_ds(session: SessionDep, id: int):
8080
for sheet in conf.sheets:
8181
conn.execute(text(f'DROP TABLE IF EXISTS "{sheet["tableName"]}"'))
8282
conn.commit()
83-
conn.close()
8483

8584
session.delete(term)
8685
session.commit()

frontend/src/views/ds/form.vue

Lines changed: 14 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
})
@@ -285,15 +286,15 @@ const check = () => {
285286
}
286287
287288
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) {
289+
if(!formEl) return
290+
await formEl.validate((valid) => {
291+
if (valid) {
292+
if (form.value.type === "excel") {
293+
// next, show tables
294+
if (excelUploadSuccess.value) {
295+
active.value++
296+
}
297+
} else {
297298
// check status if success do next
298299
buildConf()
299300
datasourceApi.check(form.value).then((res: boolean) => {
@@ -306,8 +307,8 @@ const next = async(formEl: FormInstance | undefined) => {
306307
}
307308
})
308309
}
309-
})
310-
}
310+
}
311+
})
311312
}
312313
313314
const preview = () => {
@@ -323,7 +324,6 @@ const beforeUpload = (rawFile: any) => {
323324
}
324325
325326
const onSuccess = (response: any) => {
326-
console.log(response)
327327
config.value.filename = response.data.filename
328328
config.value.sheets = response.data.sheets
329329
tableList.value = response.data.sheets

0 commit comments

Comments
 (0)