Skip to content

Commit 4fe3a75

Browse files
committed
feat: execute sql
1 parent 9734163 commit 4fe3a75

File tree

5 files changed

+91
-46
lines changed

5 files changed

+91
-46
lines changed

backend/apps/datasource/api/datasource.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from fastapi import APIRouter
2-
from ..crud.datasource import get_datasource_list, check_status, create_ds, update_ds, delete_ds, getTables, getFields
2+
from ..crud.datasource import get_datasource_list, check_status, create_ds, update_ds, delete_ds, getTables, getFields, execSql
33
from common.core.deps import SessionDep
44
from ..models.datasource import CoreDatasource
55

@@ -39,3 +39,8 @@ async def get_tables(session: SessionDep, id: int):
3939
@router.post("/getFields/{id}/{table_name}")
4040
async def get_tables(session: SessionDep, id: int, table_name: str):
4141
return getFields(session, id, table_name)
42+
43+
44+
@router.post("/execSql/{id}/{sql}")
45+
async def exec_sql(session: SessionDep, id: int, sql: str):
46+
return execSql(session, id, sql)

backend/apps/datasource/crud/datasource.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,7 @@
22
from ..models.datasource import CoreDatasource, DatasourceConf
33
import datetime
44
from common.core.deps import SessionDep
5-
import json
6-
from ..utils.utils import aes_decrypt
7-
from apps.db.db import get_session, get_tables, get_fields
5+
from apps.db.db import get_session, get_tables, get_fields, exec_sql
86
from sqlalchemy import text
97

108

@@ -15,8 +13,7 @@ def get_datasource_list(session: SessionDep) -> CoreDatasource:
1513

1614

1715
def check_status(session: SessionDep, ds: CoreDatasource):
18-
conf = DatasourceConf(**json.loads(aes_decrypt(ds.configuration)))
19-
conn = get_session(conf, ds)
16+
conn = get_session(ds)
2017
try:
2118
conn.execute(text("SELECT 1")).scalar()
2219
print("success")
@@ -59,13 +56,16 @@ def delete_ds(session: SessionDep, id: int):
5956

6057
def getTables(session: SessionDep, id: int):
6158
ds = session.exec(select(CoreDatasource).where(CoreDatasource.id == id)).first()
62-
conf = DatasourceConf(**json.loads(aes_decrypt(ds.configuration)))
63-
tables = get_tables(conf, ds)
59+
tables = get_tables(ds)
6460
return tables
6561

6662

6763
def getFields(session: SessionDep, id: int, table_name: str):
6864
ds = session.exec(select(CoreDatasource).where(CoreDatasource.id == id)).first()
69-
conf = DatasourceConf(**json.loads(aes_decrypt(ds.configuration)))
70-
fields = get_fields(conf, ds, table_name)
65+
fields = get_fields(ds, table_name)
7166
return fields
67+
68+
69+
def execSql(session: SessionDep, id: int, sql: str):
70+
ds = session.exec(select(CoreDatasource).where(CoreDatasource.id == id)).first()
71+
return exec_sql(ds, sql)

backend/apps/db/db.py

Lines changed: 70 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,12 @@
33
from apps.datasource.models.datasource import DatasourceConf, CoreDatasource, TableSchema, ColumnSchema
44
import urllib.parse
55
from typing import Any
6+
import json
7+
from apps.datasource.utils.utils import aes_decrypt
68

79

8-
def get_session(conf: DatasourceConf, ds: CoreDatasource):
10+
def get_session(ds: CoreDatasource):
11+
conf = DatasourceConf(**json.loads(aes_decrypt(ds.configuration)))
912
db_url: str
1013
if ds.type == "mysql":
1114
db_url = f"mysql+pymysql://{urllib.parse.quote(conf.username)}:{urllib.parse.quote(conf.password)}@{conf.host}:{conf.port}/{urllib.parse.quote(conf.database)}"
@@ -17,39 +20,71 @@ def get_session(conf: DatasourceConf, ds: CoreDatasource):
1720
return session
1821

1922

20-
def get_tables(conf: DatasourceConf, ds: CoreDatasource):
21-
session = get_session(conf, ds)
23+
def get_tables(ds: CoreDatasource):
24+
conf = DatasourceConf(**json.loads(aes_decrypt(ds.configuration)))
25+
session = get_session(ds)
2226
result: Result[Any]
23-
if ds.type == "mysql":
24-
sql = f"""SELECT
25-
TABLE_NAME,
26-
TABLE_COMMENT
27-
FROM
28-
information_schema.TABLES
29-
WHERE
30-
TABLE_SCHEMA = '{conf.database}';"""
31-
result = session.execute(text(sql))
32-
33-
res = result.fetchall()
34-
res_list = [TableSchema(*item) for item in res]
35-
return res_list
36-
37-
38-
def get_fields(conf: DatasourceConf, ds: CoreDatasource, table_name: str):
39-
session = get_session(conf, ds)
27+
try:
28+
if ds.type == "mysql":
29+
sql = f"""SELECT
30+
TABLE_NAME,
31+
TABLE_COMMENT
32+
FROM
33+
information_schema.TABLES
34+
WHERE
35+
TABLE_SCHEMA = '{conf.database}';"""
36+
result = session.execute(text(sql))
37+
38+
res = result.fetchall()
39+
res_list = [TableSchema(*item) for item in res]
40+
return res_list
41+
finally:
42+
if result is not None:
43+
result.close()
44+
if session is not None:
45+
session.close()
46+
47+
48+
def get_fields(ds: CoreDatasource, table_name: str):
49+
conf = DatasourceConf(**json.loads(aes_decrypt(ds.configuration)))
50+
session = get_session(ds)
4051
result: Result[Any]
41-
if ds.type == "mysql":
42-
sql = f"""SELECT
43-
COLUMN_NAME,
44-
DATA_TYPE,
45-
COLUMN_COMMENT
46-
FROM
47-
INFORMATION_SCHEMA.COLUMNS
48-
WHERE
49-
TABLE_SCHEMA = '{conf.database}' AND
50-
TABLE_NAME = '{table_name}';"""
51-
result = session.execute(text(sql))
52-
53-
res = result.fetchall()
54-
res_list = [ColumnSchema(*item) for item in res]
55-
return res_list
52+
try:
53+
if ds.type == "mysql":
54+
sql = f"""SELECT
55+
COLUMN_NAME,
56+
DATA_TYPE,
57+
COLUMN_COMMENT
58+
FROM
59+
INFORMATION_SCHEMA.COLUMNS
60+
WHERE
61+
TABLE_SCHEMA = '{conf.database}' AND
62+
TABLE_NAME = '{table_name}';"""
63+
result = session.execute(text(sql))
64+
65+
res = result.fetchall()
66+
res_list = [ColumnSchema(*item) for item in res]
67+
return res_list
68+
finally:
69+
if result is not None:
70+
result.close()
71+
if session is not None:
72+
session.close()
73+
74+
75+
def exec_sql(ds: CoreDatasource, sql: str):
76+
session = get_session(ds)
77+
result = session.execute(text(sql))
78+
try:
79+
columns = result.keys()._keys
80+
res = result.fetchall()
81+
result_list = [
82+
{columns[i]: value for i, value in enumerate(tuple_item)}
83+
for tuple_item in res
84+
]
85+
return {"fields": columns, "data": result_list}
86+
finally:
87+
if result is not None:
88+
result.close()
89+
if session is not None:
90+
session.close()

frontend/src/api/datasource.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,5 @@ export const datasourceApi = {
88
delete: (id: Number) => request.post(`/datasource/delete/${id}`),
99
getTables: (id: Number) => request.post(`/datasource/getTables/${id}`),
1010
getFields: (id: Number, table_name: string) => request.post(`/datasource/getFields/${id}/${table_name}`),
11+
execSql: (id: Number, sql: string) => request.post(`/datasource/execSql/${id}/${sql}`),
1112
}

frontend/src/views/ds/index.vue

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,11 @@ const getTables = (id: Number) => {
120120
// console.log(res)
121121
// })
122122
123-
datasourceApi.getFields(id,'core_dataset_table').then((res) => {
123+
// datasourceApi.getFields(id,'core_dataset_table').then((res) => {
124+
// console.log(res)
125+
// })
126+
127+
datasourceApi.execSql(id,'select id,name,table_name from core_dataset_table limit 10').then((res) => {
124128
console.log(res)
125129
})
126130
}

0 commit comments

Comments
 (0)