From 083ec20603c5da049655bd8576938edee56a9615 Mon Sep 17 00:00:00 2001 From: junjun Date: Wed, 23 Jul 2025 11:10:52 +0800 Subject: [PATCH 1/3] build: dependence --- backend/pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/pyproject.toml b/backend/pyproject.toml index ef279bc8..093e01ce 100644 --- a/backend/pyproject.toml +++ b/backend/pyproject.toml @@ -36,7 +36,7 @@ dependencies = [ "pyyaml (>=6.0.2,<7.0.0)", "fastapi-mcp (>=0.3.4,<0.4.0)", "tabulate>=0.9.0", - "sqlbot-xpack==0.0.3.6", + "sqlbot-xpack==0.0.3.7", "fastapi-cache2>=0.2.2", "sqlparse>=0.5.3", ] From 2fc9e413c6564fe118b8f5e740901b057bf03df5 Mon Sep 17 00:00:00 2001 From: ulleo Date: Wed, 23 Jul 2025 11:21:46 +0800 Subject: [PATCH 2/3] feat: modify template --- backend/template.yaml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/backend/template.yaml b/backend/template.yaml index a15ddecf..bc0e1fb4 100644 --- a/backend/template.yaml +++ b/backend/template.yaml @@ -13,7 +13,7 @@ template: - 如数据库引擎是 PostgreSQL、Oracle,则在schema、表名、字段名、别名外层加双引号; - 如数据库引擎是 MySQL,则在表名、字段名、别名外层加反引号; - 如数据库引擎是 Microsoft SQL Server,则在schema、表名、字段名、别名外层加方括号。 - - 如果生成SQL的字段内有时间格式的字段: + - 如果生成SQL的字段内有时间格式的字段(重要): - 若提问中没有指定查询顺序,则默认按时间升序排序 - 若提问是时间,且没有指定具体格式,则格式化为yyyy-MM-dd HH:mm:ss的格式 - 若提问是日期,且没有指定具体格式,则格式化为yyyy-MM-dd的格式 @@ -29,6 +29,8 @@ template: - 如果问题是图表展示相关且与生成SQL查询无关时,请参考上一次回答的SQL来生成SQL - 如果问题是图表展示相关,可参考的图表类型为表格(table)、柱状图(column)、条形图(bar)、折线图(line)或饼图(pie),返回的JSON: {{"success":true,"sql":"生成的SQL语句","chart-type":"选择的图表类型(table/column/bar/line/pie)","tables":["表名1","表名2",...]}} + - 生成的SQL查询结果可以用来进行图表展示,需要注意排序字段的排序优先级,例如: + - 柱状图或折线图:适合展示在横轴的字段优先排序,若SQL包含分类字段,则分类字段次一级排序 ### 响应, 请直接返回JSON结果: ```json @@ -55,7 +57,7 @@ template: - 如果需要柱状图,则生成的 JSON 格式应为(如果有分类则在JSON中返回series): {{"type":"column", "title": "标题", "axis": {{"x": {{"name":"x轴的中文名称", "value": "SQL 查询 x 轴的列(有别名用别名,去掉外层的反引号、双引号、方括号)"}}, "y": {{"name":"y轴的中文名称","value": "SQL 查询 y 轴的列(有别名用别名,去掉外层的反引号、双引号、方括号)"}}, "series": {{"name":"分类的中文名称","value":"SQL 查询分类的列(有别名用别名,去掉外层的反引号、双引号、方括号)"}}}}}} 必须从 SQL 查询列中提取“x”和“y”。 - - 如果需要条形图,则生成的 JSON 格式应为(如果有分类则在JSON中返回series): + - 如果需要条形图,则生成的 JSON 格式应为(如果有分类则在JSON中返回series),条形图相当于是旋转后的柱状图,因此 x 轴仍为维度轴,y 轴仍为指标轴: {{"type":"bar", "title": "标题", "axis": {{"x": {{"name":"x轴的中文名称", "value": "SQL 查询 x 轴的列(有别名用别名,去掉外层的反引号、双引号、方括号)"}}, "y": {{"name":"y轴的中文名称","value": "SQL 查询 y 轴的列(有别名用别名,去掉外层的反引号、双引号、方括号)"}}, "series": {{"name":"分类的中文名称","value":"SQL 查询分类的列(有别名用别名,去掉外层的反引号、双引号、方括号)"}}}}}} 必须从 SQL 查询列中提取“x”和“y”。 - 如果需要折线图,则生成的 JSON 格式应为(如果有分类则在JSON中返回series): @@ -104,7 +106,7 @@ template: - 最多返回4个你推测出的结果 - 若无法推测,则返回空数据JSON: [] - - 不需要思考过程,或者尽量精简思考过程 + - 不需要思考过程,或者尽量精简思考过程(重要) ### 响应, 请直接返回JSON结果: ```json From 6ad151db2546ab46eb8e65baf5bcdb74f41b0148 Mon Sep 17 00:00:00 2001 From: junjun Date: Wed, 23 Jul 2025 11:44:26 +0800 Subject: [PATCH 3/3] fix: check ds status --- backend/apps/datasource/api/datasource.py | 2 +- backend/apps/datasource/crud/datasource.py | 5 +++-- backend/apps/db/db.py | 2 +- frontend/src/views/ds/Datasource.vue | 18 +++++++++++------- 4 files changed, 16 insertions(+), 11 deletions(-) diff --git a/backend/apps/datasource/api/datasource.py b/backend/apps/datasource/api/datasource.py index d31fee92..e19a1278 100644 --- a/backend/apps/datasource/api/datasource.py +++ b/backend/apps/datasource/api/datasource.py @@ -30,7 +30,7 @@ async def get_datasource(session: SessionDep, id: int): @router.post("/check") async def check(session: SessionDep, ds: CoreDatasource): - return check_status(session, ds) + return check_status(session, ds, True) @router.post("/add", response_model=CoreDatasource) diff --git a/backend/apps/datasource/crud/datasource.py b/backend/apps/datasource/crud/datasource.py index 14f5b7ed..0960980b 100644 --- a/backend/apps/datasource/crud/datasource.py +++ b/backend/apps/datasource/crud/datasource.py @@ -35,14 +35,15 @@ def get_ds(session: SessionDep, id: int): return datasource -def check_status(session: SessionDep, ds: CoreDatasource): +def check_status(session: SessionDep, ds: CoreDatasource, is_raise: bool = False): conn = get_engine(ds) try: with conn.connect() as connection: print("success") return True except Exception as e: - raise HTTPException(status_code=500, detail=e.args) + if is_raise: + raise HTTPException(status_code=500, detail=f'Connect Failed: {e.args}') print("Fail:", e) return False diff --git a/backend/apps/db/db.py b/backend/apps/db/db.py index 46102cbd..b461d87e 100644 --- a/backend/apps/db/db.py +++ b/backend/apps/db/db.py @@ -126,7 +126,7 @@ def get_tables(ds: CoreDatasource): LEFT JOIN pg_description d ON d.objoid = c.oid AND d.objsubid = 0 WHERE n.nspname = current_schema() - AND c.relkind IN ('r', 'v') + AND c.relkind IN ('r', 'v', 'p') AND c.relname NOT LIKE 'pg_%' AND c.relname NOT LIKE 'sql_%' ORDER BY c.relname \ diff --git a/frontend/src/views/ds/Datasource.vue b/frontend/src/views/ds/Datasource.vue index 4dd39791..5d4a2360 100644 --- a/frontend/src/views/ds/Datasource.vue +++ b/frontend/src/views/ds/Datasource.vue @@ -95,12 +95,16 @@ const handleEditDatasource = (res: any) => { }) } -const handleQuestion = (id: string) => { - router.push({ - path: '/chat/index', - query: { - start_chat: id, - }, +const handleQuestion = (ele: any) => { + datasourceApi.check(ele).then((res: any) => { + if (res) { + router.push({ + path: '/chat/index', + query: { + start_chat: ele.id, + }, + }) + } }) } @@ -290,7 +294,7 @@ const back = () => { :type-name="ele.type_name" :num="ele.num" :description="ele.description" - @question="handleQuestion" + @question="handleQuestion(ele)" @edit="handleEditDatasource(ele)" @del="deleteHandler(ele)" @data-table-detail="dataTableDetail(ele)"