Skip to content

Commit 1c80e84

Browse files
committed
Merge branch 'main' of https://github.com/dataease/SQLBot
2 parents 67cc229 + 42f6b73 commit 1c80e84

File tree

15 files changed

+124
-62
lines changed

15 files changed

+124
-62
lines changed

Dockerfile

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,11 +54,9 @@ ENV SQLBOT_HOME=/opt/sqlbot
5454
ENV PYTHONPATH=${SQLBOT_HOME}/app
5555
ENV PATH="${SQLBOT_HOME}/app/.venv/bin:$PATH"
5656

57-
# ENV POSTGRES_SERVER=localhost
58-
# ENV POSTGRES_PORT=5432
59-
# ENV POSTGRES_DB=sqlbot
60-
# ENV POSTGRES_USER=root
61-
# ENV POSTGRES_PASSWORD=Password123@pg
57+
ENV POSTGRES_DB=sqlbot
58+
ENV POSTGRES_USER=root
59+
ENV POSTGRES_PASSWORD=Password123@pg
6260

6361
# Copy necessary files from builder
6462
COPY start.sh /opt/sqlbot/app/start.sh

Dockerfile-base

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
2222
libgif-dev \
2323
librsvg2-dev \
2424
&& curl -fsSL https://deb.nodesource.com/setup_18.x | bash - \
25+
&& curl -qL https://www.npmjs.com/install.sh | sh - \
2526
&& apt-get install -y nodejs \
2627
&& curl -L --connect-timeout 60 -m 1800 https://fit2cloud-support.oss-cn-beijing.aliyuncs.com/xpack-license/get-validator-linux | sh \
2728
&& rm -rf /var/lib/apt/lists/* \

README.md

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,19 @@ SQLBot 是一款基于大模型和 RAG 的智能问数系统。SQLBot 的优势
1919
### 安装部署
2020

2121
准备一台 Linux 服务器,执行以下一键安装脚本。
22-
在运行 SQLBot 前,请确保已安装好 [Docker](https://docs.docker.com/get-docker/)[Docker Compose](https://docs.docker.com/compose/install/)
22+
在运行 SQLBot 前,请确保已安装好 [Docker](https://docs.docker.com/get-docker/)
2323

2424
```bash
25-
# 创建目录
26-
mkdir -p /opt/sqlbot
27-
cd /opt/sqlbot
28-
29-
# 下载 docker-compose.yaml
30-
curl -o docker-compose.yaml https://raw.githubusercontent.com/dataease/SQLBot/main/docker-compose.yaml
31-
32-
# 启动服务
33-
docker compose up -d
25+
docker run -d \
26+
--name sqlbot \
27+
--restart unless-stopped \
28+
-p 8000:8000 \
29+
-p 8001:8001 \
30+
-v ./data/sqlbot/excel:/opt/sqlbot/data/excel \
31+
-v ./data/sqlbot/images:/opt/sqlbot/images \
32+
-v ./data/sqlbot/logs:/opt/sqlbot/logs \
33+
-v ./data/postgresql:/var/lib/postgresql/data \
34+
dataease/sqlbot:v1.1.1
3435
```
3536

3637
你也可以通过 [1Panel 应用商店](https://apps.fit2cloud.com/1panel) 快速部署 SQLBot。
@@ -58,8 +59,8 @@ docker compose up -d
5859

5960
## Roadmap
6061

61-
- 术语库:开发中...
6262
- SQL 示例库:开发中...
63+
- 自定义提示词:开发中...
6364

6465
## Star History
6566

backend/apps/chat/curd/chat.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,21 @@ def get_chart_config(session: SessionDep, chart_record_id: int):
7171
return {}
7272

7373

74+
def get_last_execute_sql_error(session: SessionDep, chart_id: int):
75+
stmt = select(ChatRecord.error).where(and_(ChatRecord.chat_id == chart_id)).order_by(
76+
ChatRecord.create_time.desc()).limit(1)
77+
res = session.execute(stmt).scalar()
78+
if res:
79+
try:
80+
obj = orjson.loads(res)
81+
if obj.get('type') and obj.get('type') == 'exec-sql-err':
82+
return obj.get('traceback')
83+
except Exception:
84+
pass
85+
86+
return None
87+
88+
7489
def get_chat_chart_data(session: SessionDep, chart_record_id: int):
7590
stmt = select(ChatRecord.data).where(and_(ChatRecord.id == chart_record_id))
7691
res = session.execute(stmt)
@@ -701,7 +716,8 @@ def get_old_questions(session: SessionDep, datasource: int):
701716
if not datasource:
702717
return records
703718
stmt = select(ChatRecord.question).where(
704-
and_(ChatRecord.datasource == datasource, ChatRecord.question.isnot(None), ChatRecord.error.is_(None))).order_by(
719+
and_(ChatRecord.datasource == datasource, ChatRecord.question.isnot(None),
720+
ChatRecord.error.is_(None))).order_by(
705721
ChatRecord.create_time.desc()).limit(20)
706722
result = session.execute(stmt)
707723
for r in result:

backend/apps/chat/models/chat_model.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@ class ChatInfo(BaseModel):
159159

160160

161161
class AiModelQuestion(BaseModel):
162+
question: str = None
162163
ai_modal_id: int = None
163164
ai_modal_name: str = None # Specific model name
164165
engine: str = ""
@@ -171,14 +172,15 @@ class AiModelQuestion(BaseModel):
171172
filter: str = []
172173
sub_query: Optional[list[dict]] = None
173174
terminologies: str = ""
175+
error_msg: str = ""
174176

175177
def sql_sys_question(self):
176178
return get_sql_template()['system'].format(engine=self.engine, schema=self.db_schema, question=self.question,
177179
lang=self.lang, terminologies=self.terminologies)
178180

179181
def sql_user_question(self, current_time: str):
180182
return get_sql_template()['user'].format(engine=self.engine, schema=self.db_schema, question=self.question,
181-
rule=self.rule, current_time=current_time)
183+
rule=self.rule, current_time=current_time, error_msg=self.error_msg)
182184

183185
def chart_sys_question(self):
184186
return get_chart_template()['system'].format(sql=self.sql, question=self.question, lang=self.lang)
@@ -226,7 +228,6 @@ def dynamic_user_question(self):
226228

227229

228230
class ChatQuestion(AiModelQuestion):
229-
question: str
230231
chat_id: int
231232

232233

backend/apps/chat/task/llm.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@
2424
finish_record, save_analysis_answer, save_predict_answer, save_predict_data, \
2525
save_select_datasource_answer, save_recommend_question_answer, \
2626
get_old_questions, save_analysis_predict_record, rename_chat, get_chart_config, \
27-
get_chat_chart_data, list_generate_sql_logs, list_generate_chart_logs, start_log, end_log
27+
get_chat_chart_data, list_generate_sql_logs, list_generate_chart_logs, start_log, end_log, \
28+
get_last_execute_sql_error
2829
from apps.chat.models.chat_model import ChatQuestion, ChatRecord, Chat, RenameChat, ChatLog, OperationEnum
2930
from apps.datasource.crud.datasource import get_table_schema
3031
from apps.datasource.crud.permission import get_row_permission_filters, is_normal_user
@@ -70,6 +71,8 @@ class LLMService:
7071
chunk_list: List[str] = []
7172
future: Future
7273

74+
last_execute_sql_error: str = None
75+
7376
def __init__(self, current_user: CurrentUser, chat_question: ChatQuestion,
7477
current_assistant: Optional[CurrentAssistant] = None, no_reasoning: bool = False,
7578
config: LLMConfig = None):
@@ -127,6 +130,15 @@ def __init__(self, current_user: CurrentUser, chat_question: ChatQuestion,
127130
llm_instance = LLMFactory.create_llm(self.config)
128131
self.llm = llm_instance.llm
129132

133+
# get last_execute_sql_error
134+
last_execute_sql_error = get_last_execute_sql_error(self.session, self.chat_question.chat_id)
135+
if last_execute_sql_error:
136+
self.chat_question.error_msg = f'''<error-msg>
137+
{last_execute_sql_error}
138+
</error-msg>'''
139+
else:
140+
self.chat_question.error_msg = ''
141+
130142
self.init_messages()
131143

132144
@classmethod

backend/common/core/config.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ def all_cors_origins(self) -> list[str]:
4747
POSTGRES_SERVER: str = 'localhost'
4848
POSTGRES_PORT: int = 5432
4949
POSTGRES_USER: str = 'root'
50-
POSTGRES_PASSWORD: str = "123456"
50+
POSTGRES_PASSWORD: str = "Password123@pg"
5151
POSTGRES_DB: str = "sqlbot"
5252
SQLBOT_DB_URL: str = ''
5353
# SQLBOT_DB_URL: str = 'mysql+pymysql://root:Password123%[email protected]:3306/sqlbot'

backend/common/core/sqlbot_cache.py

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ def decorator(func):
6868

6969
@wraps(func)
7070
async def wrapper(*args, **kwargs):
71-
if not settings.CACHE_TYPE or settings.CACHE_TYPE.lower() == "none":
71+
if not settings.CACHE_TYPE or settings.CACHE_TYPE.lower() == "none" or not is_cache_initialized():
7272
return await func(*args, **kwargs)
7373
# 生成缓存键
7474
cache_key = used_key_builder(
@@ -96,7 +96,7 @@ def clear_cache(
9696
def decorator(func):
9797
@wraps(func)
9898
async def wrapper(*args, **kwargs):
99-
if not settings.CACHE_TYPE or settings.CACHE_TYPE.lower() == "none":
99+
if not settings.CACHE_TYPE or settings.CACHE_TYPE.lower() == "none" or not is_cache_initialized():
100100
return await func(*args, **kwargs)
101101
cache_key = custom_key_builder(
102102
func=func,
@@ -138,4 +138,21 @@ def init_sqlbot_cache():
138138
SQLBotLogUtil.info(f"SQLBot 使用Redis缓存, 可使用多进程模式")
139139
else:
140140
SQLBotLogUtil.warning("SQLBot 未启用缓存, 可使用多进程模式")
141-
141+
142+
143+
def is_cache_initialized() -> bool:
144+
# 检查必要的属性是否存在
145+
if not hasattr(FastAPICache, "_backend") or not hasattr(FastAPICache, "_prefix"):
146+
return False
147+
148+
# 检查属性值是否为 None
149+
if FastAPICache._backend is None or FastAPICache._prefix is None:
150+
return False
151+
152+
# 尝试获取后端确认
153+
try:
154+
backend = FastAPICache.get_backend()
155+
return backend is not None
156+
except (AssertionError, AttributeError, Exception) as e:
157+
SQLBotLogUtil.debug(f"缓存初始化检查失败: {str(e)}")
158+
return False

backend/template.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ template:
9898
- 柱状图或折线图:适合展示在横轴的字段优先排序,若SQL包含分类字段,则分类字段次一级排序
9999
</rule>
100100
<rule>
101-
如果用户没有指定数据条数的限制,输出的查询SQL需要加上1000条的数据条数限制
101+
如果用户没有指定数据条数的限制,输出的查询SQL必须加上1000条的数据条数限制
102102
如果用户指定的限制大于1000,则按1000处理
103103
<example>
104104
以PostgreSQL为例,查询Schema为TEST表TABLE下id字段,则生成的SQL为:
@@ -235,6 +235,7 @@ template:
235235
{current_time}
236236
</current-time>
237237
<background-infos>
238+
{error_msg}
238239
<user-question>
239240
{question}
240241
</user-question>

docker-compose.yaml

Lines changed: 5 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
services:
22
sqlbot:
3-
image: dataease/sqlbot:v1.0.0
3+
image: dataease/sqlbot:v1.1.0
44
container_name: sqlbot
55
restart: always
66
networks:
@@ -10,11 +10,11 @@ services:
1010
- 8001:8001
1111
environment:
1212
# Database configuration
13-
POSTGRES_SERVER: sqlbot-db
13+
POSTGRES_SERVER: localhost
1414
POSTGRES_PORT: 5432
1515
POSTGRES_DB: sqlbot
16-
POSTGRES_USER: sqlbot
17-
POSTGRES_PASSWORD: sqlbot
16+
POSTGRES_USER: root
17+
POSTGRES_PASSWORD: Password123@pg
1818
# Project basic settings
1919
PROJECT_NAME: "SQLBot"
2020
DEFAULT_PWD: "SQLBot@123456"
@@ -31,26 +31,7 @@ services:
3131
- ./data/sqlbot/excel:/opt/sqlbot/data/excel
3232
- ./data/sqlbot/images:/opt/sqlbot/images
3333
- ./data/sqlbot/logs:/opt/sqlbot/logs
34-
depends_on:
35-
sqlbot-db:
36-
condition: service_healthy
37-
38-
sqlbot-db:
39-
image: postgres:17.5
40-
container_name: sqlbot-db
41-
restart: always
42-
networks:
43-
- sqlbot-network
44-
volumes:
4534
- ./data/postgresql:/var/lib/postgresql/data
46-
environment:
47-
POSTGRES_DB: sqlbot
48-
POSTGRES_USER: sqlbot
49-
POSTGRES_PASSWORD: sqlbot
50-
healthcheck:
51-
test: ["CMD-SHELL", "pg_isready"]
52-
interval: 3s
53-
timeout: 5s
54-
retries: 5
35+
5536
networks:
5637
sqlbot-network:

0 commit comments

Comments
 (0)