diff --git a/AI/Text2Sql/Model/__pycache__/biModel.cpython-310.pyc b/AI/Text2Sql/Model/__pycache__/biModel.cpython-310.pyc index 9a0dceb2..eeaa4a4c 100644 Binary files a/AI/Text2Sql/Model/__pycache__/biModel.cpython-310.pyc and b/AI/Text2Sql/Model/__pycache__/biModel.cpython-310.pyc differ diff --git a/AI/Text2Sql/Model/biModel.py b/AI/Text2Sql/Model/biModel.py index 6c514cc4..2f085611 100644 --- a/AI/Text2Sql/Model/biModel.py +++ b/AI/Text2Sql/Model/biModel.py @@ -1,23 +1,25 @@ -from Text2Sql.Util.PostgreSQLUtil import PostgreSQLUtil +from Text2Sql.Util.PostgreSQLUtil import PostgreSQLUtil, postgresql_pool # 删除数据 -def delete_question(db, question_id: str): - # 删除 t_bi_question 表中的数据 - delete_sql = """ - DELETE FROM t_bi_question WHERE id = %s - """ - db.execute_query(delete_sql, (question_id,)) +def delete_question(question_id: str): + with PostgreSQLUtil(postgresql_pool.getconn()) as db: + # 删除 t_bi_question 表中的数据 + delete_sql = """ + DELETE FROM t_bi_question WHERE id = %s + """ + db.execute_query(delete_sql, (question_id,)) # 插入数据 -def insert_question(db, question_id: str, question: str): +def insert_question(question_id: str, question: str): # 向 t_bi_question 表插入数据 - insert_sql = """ - INSERT INTO t_bi_question (id,question, state_id, is_system, is_collect) - VALUES (%s,%s, %s, %s, %s) - """ - db.execute_query(insert_sql, (question_id, question, 0, 0, 0)) + with PostgreSQLUtil(postgresql_pool.getconn()) as db: + insert_sql = """ + INSERT INTO t_bi_question (id,question, state_id, is_system, is_collect) + VALUES (%s,%s, %s, %s, %s) + """ + db.execute_query(insert_sql, (question_id, question, 0, 0, 0)) # 修改数据 @@ -37,7 +39,7 @@ update_question_by_id(db, question_id=1, question=None, state_id=None) ''' -def update_question_by_id(db: PostgreSQLUtil, question_id: str, **kwargs): +def update_question_by_id(question_id: str, **kwargs): """ 根据主键更新 t_bi_question 表,只更新非 None 的字段 :param db: PostgreSQLUtil 实例 @@ -52,74 +54,81 @@ def update_question_by_id(db: PostgreSQLUtil, question_id: str, **kwargs): # 动态构建 SET 子句 set_clause = ", ".join([f"{field} = %s" for field in update_fields.keys()]) - # 构建完整 SQL - sql = f""" - UPDATE t_bi_question - SET {set_clause} - WHERE id = %s - """ - # 参数列表 - params = list(update_fields.values()) + [question_id] - # 执行更新 - try: - db.execute_query(sql, params) - return True - except Exception as e: - print(f"更新失败: {e}") - return False + with PostgreSQLUtil(postgresql_pool.getconn()) as db: + # 构建完整 SQL + sql = f""" + UPDATE t_bi_question + SET {set_clause} + WHERE id = %s + """ + # 参数列表 + params = list(update_fields.values()) + [question_id] + + # 执行更新 + try: + db.execute_query(sql, params) + return True + except Exception as e: + print(f"更新失败: {e}") + return False # 根据 问题id 查询 sql -def get_question_by_id(db, question_id: str): - select_sql = """ - select * from t_bi_question where id=%s - """ - _data = db.execute_query(select_sql, (question_id,)) - return _data +def get_question_by_id(question_id: str): + with PostgreSQLUtil(postgresql_pool.getconn()) as db: + select_sql = """ + select * from t_bi_question where id=%s + """ + _data = db.execute_query(select_sql, (question_id,)) + return _data # 保存系统推荐 -def set_system_recommend_questions(db, question_id: str, flag: str): - sql = f""" - UPDATE t_bi_question - SET is_system =%s WHERE id = %s - """ - # 执行更新 - try: - db.execute_query(sql, int(flag), question_id) - return True - except Exception as e: - print(f"更新失败: {e}") - return False +def set_system_recommend_questions(question_id: str, flag: str): + with PostgreSQLUtil(postgresql_pool.getconn()) as db: + sql = f""" + UPDATE t_bi_question + SET is_system =%s WHERE id = %s + """ + # 执行更新 + try: + db.execute_query(sql, int(flag), question_id) + return True + except Exception as e: + print(f"更新失败: {e}") + return False # 设置用户收藏 -def set_user_collect_questions(db, question_id: str, flag: str): +def set_user_collect_questions(question_id: str, flag: str): sql = f""" UPDATE t_bi_question SET is_collect =%s WHERE id = %s """ - # 执行更新 - try: - db.execute_query(sql, int(flag), question_id) - return True - except Exception as e: - print(f"更新失败: {e}") - return False + with PostgreSQLUtil(postgresql_pool.getconn()) as db: + # 执行更新 + try: + db.execute_query(sql, int(flag), question_id) + return True + except Exception as e: + print(f"更新失败: {e}") + return False # 查询有哪些系统推荐问题 -def get_system_recommend_questions(db): +def get_system_recommend_questions(): sql = """ SELECT * FROM t_bi_question WHERE is_system = 1 """ - _data = db.execute_query(sql) - return _data + with PostgreSQLUtil(postgresql_pool.getconn()) as db: + _data = db.execute_query(sql) + return _data # 查询有哪些用户收藏问题 -def get_user_collect_questions(db): +def get_user_collect_questions(): # 从t_bi_question表中获取所有is_collect=1的数据 sql=""" SELECT * FROM t_bi_question WHERE is_collect = 1 """ - _data = db.execute_query(sql) - return _data \ No newline at end of file + with PostgreSQLUtil(postgresql_pool.getconn()) as db: + _data = db.execute_query(sql) + return _data \ No newline at end of file diff --git a/AI/Text2Sql/Util/PostgreSQLUtil.py b/AI/Text2Sql/Util/PostgreSQLUtil.py index 62c244f1..b45ac52e 100644 --- a/AI/Text2Sql/Util/PostgreSQLUtil.py +++ b/AI/Text2Sql/Util/PostgreSQLUtil.py @@ -22,6 +22,13 @@ class PostgreSQLUtil: def __init__(self, connection): self.connection = connection + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self.connection.commit() + postgresql_pool.putconn(self.connection) + def execute_query(self, sql, params=None, return_dict=True): """执行查询并返回结果""" try: @@ -46,20 +53,6 @@ class PostgreSQLUtil: print(f"执行SQL出错: {e}") self.connection.rollback() raise - finally: - self.connection.commit() - - def query_to_json(self, sql, params=None): - """返回JSON格式结果""" - data = self.execute_query(sql, params) - return json.dumps(data, default=self.json_serializer) - - @staticmethod - def json_serializer(obj): - """处理JSON无法序列化的类型""" - if isinstance(obj, (date, datetime)): - return obj.isoformat() - raise TypeError(f"Type {type(obj)} not serializable") def get_db(): diff --git a/AI/Text2Sql/Util/__pycache__/PostgreSQLUtil.cpython-310.pyc b/AI/Text2Sql/Util/__pycache__/PostgreSQLUtil.cpython-310.pyc index 8db32115..75c3c6a6 100644 Binary files a/AI/Text2Sql/Util/__pycache__/PostgreSQLUtil.cpython-310.pyc and b/AI/Text2Sql/Util/__pycache__/PostgreSQLUtil.cpython-310.pyc differ diff --git a/AI/Text2Sql/__pycache__/app.cpython-310.pyc b/AI/Text2Sql/__pycache__/app.cpython-310.pyc index 77c190e6..9eb8bfb5 100644 Binary files a/AI/Text2Sql/__pycache__/app.cpython-310.pyc and b/AI/Text2Sql/__pycache__/app.cpython-310.pyc differ diff --git a/AI/Text2Sql/app.py b/AI/Text2Sql/app.py index 07066c4d..c5b9841c 100644 --- a/AI/Text2Sql/app.py +++ b/AI/Text2Sql/app.py @@ -2,15 +2,14 @@ import json import uuid import uvicorn # 导入 uvicorn -from fastapi import FastAPI, Depends, Form, Query +from fastapi import FastAPI, Form, Query from openai import OpenAI from starlette.responses import StreamingResponse from starlette.staticfiles import StaticFiles -from Config import MODEL_API_KEY, MODEL_API_URL, MODEL_NAME +from Config import MODEL_API_KEY, MODEL_API_URL, QWEN_MODEL_NAME from Model.biModel import * from Text2Sql.Util.MarkdownToDocxUtil import markdown_to_docx -from Text2Sql.Util.PostgreSQLUtil import get_db from Text2Sql.Util.SaveToExcel import save_to_excel from Text2Sql.Util.VannaUtil import VannaUtil @@ -31,7 +30,7 @@ def read_root(): # 通过语义生成Excel # http://10.10.21.20:8000/questions/get_excel @app.post("/questions/get_excel") -def get_excel(question_id: str = Form(...), question_str: str = Form(...), db: PostgreSQLUtil = Depends(get_db)): +def get_excel(question_id: str = Form(...), question_str: str = Form(...)): # 只接受guid号 if len(question_id) != 36: return {"success": False, "message": "question_id格式错误"} @@ -44,24 +43,25 @@ def get_excel(question_id: str = Form(...), question_str: str = Form(...), db: P question = question_str + common_prompt # 先删除后插入,防止重复插入 - delete_question(db, question_id) - insert_question(db, question_id, question) + delete_question(question_id) + insert_question(question_id, question) # 获取完整 SQL sql = vn.generate_sql(question) print("生成的查询 SQL:\n", sql) # 更新question_id - update_question_by_id(db, question_id=question_id, sql=sql, state_id=1) + update_question_by_id(question_id=question_id, sql=sql, state_id=1) # 执行SQL查询 - _data = db.execute_query(sql) + with PostgreSQLUtil(postgresql_pool.getconn()) as db: + _data = db.execute_query(sql) # 在static目录下,生成一个guid号的临时文件 uuid_str = str(uuid.uuid4()) filename = f"static/{uuid_str}.xlsx" save_to_excel(_data, filename) # 更新EXCEL文件名称 - update_question_by_id(db, question_id, excel_file_name=filename) + update_question_by_id(question_id, excel_file_name=filename) # 返回静态文件URL return {"success": True, "message": "Excel文件生成成功", "download_url": f"/static/{uuid_str}.xlsx"} @@ -70,8 +70,7 @@ def get_excel(question_id: str = Form(...), question_str: str = Form(...), db: P @app.api_route("/questions/get_docx_stream", methods=["POST", "GET"]) async def get_docx_stream( question_id: str = Form(None, description="问题ID(POST请求)"), # POST 请求参数 - question_id_get: str = Query(None, description="问题ID(GET请求)"), # GET 请求参数 - db: PostgreSQLUtil = Depends(get_db) + question_id_get: str = Query(None, description="问题ID(GET请求)") # GET 请求参数 ): # 根据请求方式获取 question_id if question_id is not None: # POST 请求 @@ -82,7 +81,7 @@ async def get_docx_stream( return {"success": False, "message": "缺少问题ID参数"} # 根据问题ID获取查询sql - sql = get_question_by_id(db, question_id)[0]['sql'] + sql = get_question_by_id(question_id)[0]['sql'] # 4、生成word报告 prompt = ''' 请根据以下 JSON 数据,整理出2000字左右的话描述当前数据情况。要求: @@ -92,7 +91,8 @@ async def get_docx_stream( 4、尽量以条目列出,这样更清晰 5、数据: ''' - _data = db.execute_query(sql) + with PostgreSQLUtil(postgresql_pool.getconn()) as db: + _data = db.execute_query(sql) prompt = prompt + json.dumps(_data, ensure_ascii=False) # 初始化 OpenAI 客户端 @@ -103,7 +103,8 @@ async def get_docx_stream( # 调用 OpenAI API 生成总结(流式输出) response = client.chat.completions.create( - model=MODEL_NAME, + #model=MODEL_NAME, + model=QWEN_MODEL_NAME, messages=[ {"role": "system", "content": "你是一个数据分析助手,擅长从 JSON 数据中提取关键信息并生成详细的总结。"}, {"role": "user", "content": prompt} @@ -126,6 +127,7 @@ async def get_docx_stream( chunk_content = chunk.choices[0].delta.content # 逐字拆分并返回 for char in chunk_content: + print(char, end="", flush=True) # 逐字输出到控制台 yield char.encode("utf-8") # 将字符编码为 UTF-8 字节 summary += char # 将内容拼接到 summary 中 @@ -133,7 +135,7 @@ async def get_docx_stream( markdown_to_docx(summary, output_file=filename) # 记录到数据库 - update_question_by_id(db, question_id, docx_file_name=filename) + update_question_by_id(question_id, docx_file_name=filename) except Exception as e: # 如果发生异常,返回错误信息 @@ -141,6 +143,7 @@ async def get_docx_stream( "success": False, "message": f"生成Word文件失败: {str(e)}" }) + print(error_response) # 输出错误信息到控制台 yield error_response.encode("utf-8") # 将错误信息编码为 UTF-8 字节 finally: @@ -168,7 +171,6 @@ async def get_docx_stream( async def get_docx_file( question_id: str = Form(None, description="问题ID(POST请求)"), # POST 请求参数 question_id_get: str = Query(None, description="问题ID(GET请求)"), # GET 请求参数 - db: PostgreSQLUtil = Depends(get_db) ): # 根据请求方式获取 question_id if question_id is not None: # POST 请求 @@ -179,7 +181,7 @@ async def get_docx_file( return {"success": False, "message": "缺少问题ID参数"} # 根据问题ID获取查询docx_file_name - docx_file_name = get_question_by_id(db, question_id)[0]['docx_file_name'] + docx_file_name = get_question_by_id(question_id)[0]['docx_file_name'] # 返回成功和静态文件的URL return {"success": True, "message": "Word文件生成成功", "download_url": f"{docx_file_name}"} @@ -187,31 +189,31 @@ async def get_docx_file( # 设置问题为系统推荐问题 ,0:取消,1:设置 @app.post("/questions/set_system_recommend") -def set_system_recommend(question_id: str = Form(...), flag: str = Form(...), db: PostgreSQLUtil = Depends(get_db)): - set_system_recommend_questions(db, question_id, flag) +def set_system_recommend(question_id: str = Form(...), flag: str = Form(...)): + set_system_recommend_questions(question_id, flag) # 提示保存成功 return {"success": True, "message": "保存成功"} # 设置问题为用户收藏问题 ,0:取消,1:设置 @app.post("/questions/set_user_collect") -def set_user_collect(question_id: str = Form(...), flag: str = Form(...), db: PostgreSQLUtil = Depends(get_db)): - set_user_collect_questions(db, question_id, flag) +def set_user_collect(question_id: str = Form(...), flag: str = Form(...)): + set_user_collect_questions(question_id, flag) # 提示保存成功 return {"success": True, "message": "保存成功"} # 查询有哪些系统推荐问题 @app.get("/questions/get_system_recommend") -def get_system_recommend(db: PostgreSQLUtil = Depends(get_db)): +def get_system_recommend(): # 查询所有系统推荐问题 - system_recommend_questions = get_system_recommend_questions(db) + system_recommend_questions = get_system_recommend_questions() # 返回查询结果 return {"success": True, "data": system_recommend_questions} # 查询有哪些用户收藏问题 @app.get("/questions/get_user_collect") -def get_user_collect(db: PostgreSQLUtil = Depends(get_db)): +def get_user_collect(): # 查询所有用户收藏问题 - user_collect_questions = get_user_collect_questions(db) + user_collect_questions = get_user_collect_questions() # 返回查询结果 return {"success": True, "data": user_collect_questions} diff --git a/AI/Text2Sql/static/18be20b2-23a2-4d28-aed5-fca29b243a3f.docx b/AI/Text2Sql/static/18be20b2-23a2-4d28-aed5-fca29b243a3f.docx new file mode 100644 index 00000000..662c1ac5 Binary files /dev/null and b/AI/Text2Sql/static/18be20b2-23a2-4d28-aed5-fca29b243a3f.docx differ diff --git a/AI/Text2Sql/static/538a007e-3345-4efe-972e-ecfff43478f5.docx b/AI/Text2Sql/static/538a007e-3345-4efe-972e-ecfff43478f5.docx new file mode 100644 index 00000000..16f18b78 Binary files /dev/null and b/AI/Text2Sql/static/538a007e-3345-4efe-972e-ecfff43478f5.docx differ diff --git a/AI/Text2Sql/static/57c151a2-bc79-4e5c-9de5-a26f2ce94821.docx b/AI/Text2Sql/static/57c151a2-bc79-4e5c-9de5-a26f2ce94821.docx new file mode 100644 index 00000000..25833d33 Binary files /dev/null and b/AI/Text2Sql/static/57c151a2-bc79-4e5c-9de5-a26f2ce94821.docx differ diff --git a/AI/Text2Sql/static/5f143512-efa0-4147-b925-26367b223c16.docx b/AI/Text2Sql/static/5f143512-efa0-4147-b925-26367b223c16.docx new file mode 100644 index 00000000..80dee155 Binary files /dev/null and b/AI/Text2Sql/static/5f143512-efa0-4147-b925-26367b223c16.docx differ diff --git a/AI/Text2Sql/static/60c59689-0564-444c-9033-694f0fff81c5.docx b/AI/Text2Sql/static/60c59689-0564-444c-9033-694f0fff81c5.docx new file mode 100644 index 00000000..e6e9aa6b Binary files /dev/null and b/AI/Text2Sql/static/60c59689-0564-444c-9033-694f0fff81c5.docx differ diff --git a/AI/Text2Sql/static/62a3f99b-5bb3-410b-a7bf-099d3d717765.docx b/AI/Text2Sql/static/62a3f99b-5bb3-410b-a7bf-099d3d717765.docx new file mode 100644 index 00000000..036ac85a Binary files /dev/null and b/AI/Text2Sql/static/62a3f99b-5bb3-410b-a7bf-099d3d717765.docx differ diff --git a/AI/Text2Sql/static/688eb324-04bc-455a-b112-25128260e0d6.docx b/AI/Text2Sql/static/688eb324-04bc-455a-b112-25128260e0d6.docx new file mode 100644 index 00000000..58f7b960 Binary files /dev/null and b/AI/Text2Sql/static/688eb324-04bc-455a-b112-25128260e0d6.docx differ diff --git a/AI/Text2Sql/static/6a3feb52-9876-46cc-aabd-b24061af2d78.docx b/AI/Text2Sql/static/6a3feb52-9876-46cc-aabd-b24061af2d78.docx new file mode 100644 index 00000000..4a0220c9 Binary files /dev/null and b/AI/Text2Sql/static/6a3feb52-9876-46cc-aabd-b24061af2d78.docx differ diff --git a/AI/Text2Sql/static/a3b4b77b-7995-474a-b0f4-d325ee8d7590.docx b/AI/Text2Sql/static/a3b4b77b-7995-474a-b0f4-d325ee8d7590.docx new file mode 100644 index 00000000..044b9777 Binary files /dev/null and b/AI/Text2Sql/static/a3b4b77b-7995-474a-b0f4-d325ee8d7590.docx differ diff --git a/AI/Text2Sql/static/b6785bb0-7c0a-4319-812d-c8200830c37f.docx b/AI/Text2Sql/static/b6785bb0-7c0a-4319-812d-c8200830c37f.docx new file mode 100644 index 00000000..c123bdba Binary files /dev/null and b/AI/Text2Sql/static/b6785bb0-7c0a-4319-812d-c8200830c37f.docx differ diff --git a/AI/Text2Sql/static/b744f7a5-8212-4149-949d-7b2c41c8a1e2.docx b/AI/Text2Sql/static/b744f7a5-8212-4149-949d-7b2c41c8a1e2.docx new file mode 100644 index 00000000..12119f43 Binary files /dev/null and b/AI/Text2Sql/static/b744f7a5-8212-4149-949d-7b2c41c8a1e2.docx differ diff --git a/AI/Text2Sql/static/be2d2e9b-5d32-4e79-8185-b319e018d34b.docx b/AI/Text2Sql/static/be2d2e9b-5d32-4e79-8185-b319e018d34b.docx new file mode 100644 index 00000000..649f10fe Binary files /dev/null and b/AI/Text2Sql/static/be2d2e9b-5d32-4e79-8185-b319e018d34b.docx differ diff --git a/AI/Text2Sql/static/bf3ea49b-88b9-4a73-92c0-1fcf2f3b980f.docx b/AI/Text2Sql/static/bf3ea49b-88b9-4a73-92c0-1fcf2f3b980f.docx new file mode 100644 index 00000000..6248fd44 Binary files /dev/null and b/AI/Text2Sql/static/bf3ea49b-88b9-4a73-92c0-1fcf2f3b980f.docx differ diff --git a/AI/Text2Sql/static/e59aad57-ff98-4c05-b40b-5f167164cd17.docx b/AI/Text2Sql/static/e59aad57-ff98-4c05-b40b-5f167164cd17.docx new file mode 100644 index 00000000..3229a33d Binary files /dev/null and b/AI/Text2Sql/static/e59aad57-ff98-4c05-b40b-5f167164cd17.docx differ diff --git a/AI/Text2Sql/static/e6f0e2fa-6780-4f06-87a8-8b832457c35f.docx b/AI/Text2Sql/static/e6f0e2fa-6780-4f06-87a8-8b832457c35f.docx new file mode 100644 index 00000000..83a6824d Binary files /dev/null and b/AI/Text2Sql/static/e6f0e2fa-6780-4f06-87a8-8b832457c35f.docx differ