11import hashlib
2+ import os
23import uuid
34from typing import List
45
56import pandas as pd
67from fastapi import APIRouter , File , UploadFile , HTTPException
7- from numba .core .cgutils import if_zero
88
99from apps .db .engine import create_table , get_data_engine , insert_data
1010from common .core .deps import SessionDep
1515from ..models .datasource import CoreDatasource , CreateDatasource , EditObj , CoreTable
1616
1717router = 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 }
0 commit comments