From 9265818e2700735a84e52ac5acbf662a2ad694f9 Mon Sep 17 00:00:00 2001 From: HuangHai <10402852@qq.com> Date: Mon, 17 Mar 2025 09:34:55 +0800 Subject: [PATCH] 'commit' --- AI/Text2Sql/Util/PostgreSQLUtil.py | 40 +++++++++ AI/Text2Sql/__pycache__/app.cpython-310.pyc | Bin 6623 -> 6593 bytes AI/Text2Sql/app.py | 93 ++++++++++++-------- 3 files changed, 96 insertions(+), 37 deletions(-) create mode 100644 AI/Text2Sql/Util/PostgreSQLUtil.py diff --git a/AI/Text2Sql/Util/PostgreSQLUtil.py b/AI/Text2Sql/Util/PostgreSQLUtil.py new file mode 100644 index 00000000..e896e6c9 --- /dev/null +++ b/AI/Text2Sql/Util/PostgreSQLUtil.py @@ -0,0 +1,40 @@ +import json +from datetime import date, datetime + +from asyncpg.pool import Pool +from sqlalchemy.dialects.postgresql import asyncpg + +from Config import * + + +class PostgreSQLUtil: + def __init__(self, pool: Pool): + self.pool = pool + + async def execute_query(self, sql, params=None): + async with self.pool.acquire() as connection: + result = await connection.fetch(sql, params) + return result + + async def query_to_json(self, sql, params=None): + data = await 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") + +async def create_pool(): + return await asyncpg.create_pool( + host=PG_HOST, + port=PG_PORT, + database=PG_DATABASE, + user=PG_USER, + password=PG_PASSWORD, + min_size=1, + max_size=10 + ) + diff --git a/AI/Text2Sql/__pycache__/app.cpython-310.pyc b/AI/Text2Sql/__pycache__/app.cpython-310.pyc index dd63c21a1ab4900124692cdf2ccb8bb1a5a67904..d95a34ee5f14334e4a43b9071e85d65287928821 100644 GIT binary patch delta 3017 zcmaJ@|8Eq>72lcN+uJ+eozKQT`)rKCa5l#mn;4g-4R)Xb0#Yzh?b3Ez>2%!8IcN56 z&Fmi7uF*lxO(?CCpiKf1Ndrjz!Ag@*A+>5738D5+s8nhD18NnUQuQ~~pQ?twH@2~T zh2DBT`{unjZ{BumnppF!Vs`N4jZG|ZlkgC0sji^GJE|nFvR2;7 zk}%qMW%Kx!yw2L$#@PTE>f$lJm2YDmbJR?M3*BrJ>tvh9DBChe!4zR#Y%5SpqA)D*y`Qa+S4f{C3FMj>to!_uv5E$ zb_@V|Awdk%`&jI_lMFZ0cq8!As@RFTs&mHjh9aY(c~$HIhIr1q9vR=|2lCv_y#``e z_*%JKV158`KtynHNG=w*gV^o$MLS5pcRbqJR^vzr9pRHXZtd~jh^EQWJGZ0vNc+E< zVBLc+ez$P@%EPOlJ-l`8*rA2DUtfIhw&?SIRzE=c@7$~Zgpib1Y-nq*F&W-(6&yEb z7bk`$y;}``BrV=pVhWrujurU_>*eQ^b4ohuJ=#!cD>p;53!mLuy!4v~pM1Xf{-+CHT=@IlpD(`k z3-5z-g5}`42=Uj6GiNA=8#t}{< z40_iR&sPp0c@W`S2qA!#0y=>Vxp6;GzCIz~U|n$-Cn5AX!?KWqBdF#gNQWGxWTk^w zQ0aDVa@ngNfW$cjKra|U9g1EjVedpscV(+aD4`UFe6)Y-{}C5KZ@RVbOqn~FB&Y9* zv3$YeIcWV)ekxEJj6c9|(3^{72F|}sgfXL>S4xo?_$jzAuUkBC>np1?8?P`-*ElkuPnnNqgMN6QJ|e%BUk z@%=Zy{Qa*Vy!-LurFYetu$`si0{T4FAuUF7|%}t7~3->N) zIB@{ToW7hn8dqbgm<8r^=bAJ*u$eRExV)GV9ByI}I+?HKt?bykoMHYjZ!f{9Ji;rF z$(SKkitTYFLG#-1Xc>FTmv=u}`1IOxT$l}rYtz%VdJ?EJPnSyd$DmysUDLXym1Q^o z1e%ZVAj33F#bqF-+iM~#J6vRPHe92e`^6@RGb?F+ga_y%bry2VjxFS=nt6^FZ9!%He8rQ5%+B1U^Z^2UWHUN56yKL1f zkS5j|T$PB_4m2U_f9U{ft^5P!?;>3FF1KtyiPb8wZ~MC7mYrqkJz@-bvbSL`^TRp2 zVB|%wve+$$q(k?E1#Vx2s{>n)g}T6x<^`*u^{T|HhliG1z~uvv?fW& z%eM|zWLHm)g311oGgj|++=A6Rl0C~uZS3Qg{P6lM>*Xi2rBW6(MHF|y{|o#;(Jq%< z@d7e>5HNUOo3NpAAHaD#!a0Pa0DkoNi9?59$#^}@V7^Z1EwiRmTM|6a$)bgcvkV;_$}Dphn9w zsjCU1L${8TaJ``#n)ln}=I(e7E-lf%f)4(e(#TgvQx`FG9ARPv!z8RHi1zrurvni) delta 2999 zcmZV=OKjZ6l|youRyN6X>|&w;qCLgtS*6Py#1H);EdNTzFDuw@3ndbFX#37{Z_xg^WK0zXblpHX={=- z#D*3Q&;rZSA}wtYfE^nO@CJc5%<{C8X>&5&N4wV5HDZ;S)?{V6e}h;WF?E zNG9RO}0PP2H9528Ku{4&*l2n1jo0a$pn1Y=sgU$?@Hzy`7 z!=6~DS1NARjVhIAa1-3EnIVmyy+@C?7fm~8U;9C?8!$eD5n2FN;rs<@lWa*-(go1t zW$AABva+OX%AlFNCAVnH>XLc|6sM93@0!x0643fIN;N?&9J@}4gzpD+e^|lo7;ZK$B~leEUbIc(+20+B6I2ytGr!j{KnT{rEs0R(nUIn zOiul;*%*Av`aKeRJfMO&4&i}AfS?C9F%D0xRU)z=FDc*|g^~>!LMu;0Hfxm4*`OaJ z;5R@pQ5V9XnxtsG>DR)fh_gz_xNCcEgK=1eX7VWnsI;gL`zyu?qbgBQL3vEUFbzOn z=_Doc6}$EIXq!=a=gbfA-^7W-m>D{=w$w+wbrE=G~oJAMD(|^YHHa!%u#@^NXK0QkQSk zSh>+rt_D%LZL8h9>M=8&WZclLhLK%$7{|2an0blehQVCGeLG4Fls?CKz!NnB6nv@# zR~Mdg34ad6&cYCmC@4DVB8>x21$d9Mn~b-r$4HyaSo6W+n~InLJjPG zbN?1A8eJ2REn(ya)o=nEB3pErH=bJMI^iytNOw* zJ_$HfX#~-#*Ik;V5Ki$TkWHf{`Z6xR5Z~2@$W;7meYk(Gs)_OV;FhWJQedN{nUzsT~wS6M{5&1d_;*CLFCxZ4TkDtPJ-~^oR@`32?nddz>jGVx)o&9;7 z&;Onb#DC78Czs;>!l4}8($Xq)?`5fRGk&G8I%=v?q}}j|v<#P4V<^%$4XRTk$}GW^ z{GoJDrkPkTPM*m|*){1Mi7($$Hgj8#dSR=PVKbv`{_VZ|>(X^-{PAMZjlU=kFT9E_ z)1i&k!0XJ+Cz^9Da2*yxn_ymK^BOwr3a(1CsuNJg3pmjpHLS!q2T`hF(D=7-DK-TD zhFI?fj_rj>+IGAkWbwVynW+oNeG7pIWCJk~0pY0PJgYJew{Znx$ZY>(V297fg^n_j zwzpg`<<4(5@idNi1OGk(%=C7+uOUGkia7(#n?n>L{sWvCq9oz+w|NDZ z{RDwf<`!aYjo@MqoW(~P-2_hfA^>?s*V1rDr%5Kx?i<@bB9dBer?vV;`oH{6Jlk{h zQZH`S2LRK<3v6mmv@8%BW5*G_$I98^jjB_dAFshLh$#6)n}fd)yXK024~|`yYw@3Y z`Yz%>LXvTUYQz>J&%MeGjsPKAqS8)hm3peY}w>sZhyc5DV0qBwr*GUdKX%5~Jcv_F& X>>ElKRJ}{j#y9)QX}!`-)Gz-JW75Jd diff --git a/AI/Text2Sql/app.py b/AI/Text2Sql/app.py index fba6225f..e4928ab5 100644 --- a/AI/Text2Sql/app.py +++ b/AI/Text2Sql/app.py @@ -1,14 +1,12 @@ import asyncio import json import uuid -from datetime import date, datetime -from asyncpg.pool import Pool -from fastapi import FastAPI, Form, Query -from fastapi.staticfiles import StaticFiles from contextlib import asynccontextmanager -from fastapi import FastAPI, Depends -import asyncpg + import uvicorn +from fastapi import FastAPI, Depends +from fastapi import Form, Query +from fastapi.staticfiles import StaticFiles from openai import AsyncOpenAI from starlette.responses import StreamingResponse @@ -47,37 +45,6 @@ async def get_db(): async with app.state.pool.acquire() as connection: yield connection -class PostgreSQLUtil: - def __init__(self, pool: Pool): - self.pool = pool - - async def execute_query(self, sql, params=None): - async with self.pool.acquire() as connection: - result = await connection.fetch(sql, params) - return result - - async def query_to_json(self, sql, params=None): - data = await 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") - -async def create_pool(): - return await asyncpg.create_pool( - host=PG_HOST, - port=PG_PORT, - database=PG_DATABASE, - user=PG_USER, - password=PG_PASSWORD, - min_size=1, - max_size=10 - ) - @app.post("/questions/get_excel") async def get_excel(question_id: str = Form(...), question_str: str = Form(...), db: asyncpg.Connection = Depends(get_db)): # 只接受guid号 @@ -218,6 +185,58 @@ async def get_docx_stream( } ) + +# 返回生成的Word文件下载地址 +# http://10.10.21.20:8000/questions/get_docx_file?question_id_get=af15d834-e7f5-46b4-a0f6-15f1f888f443 +@app.api_route("/questions/get_docx_file", methods=["POST", "GET"]) +async def get_docx_file( + question_id: str = Form(None, description="问题ID(POST请求)"), # POST 请求参数 + question_id_get: str = Query(None, description="问题ID(GET请求)"), # GET 请求参数 +): + # 根据请求方式获取 question_id + if question_id is not None: # POST 请求 + question_id = question_id + elif question_id_get is not None: # GET 请求 + question_id = question_id_get + else: + return {"success": False, "message": "缺少问题ID参数"} + + # 根据问题ID获取查询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}"} + + +# 设置问题为系统推荐问题 ,0:取消,1:设置 +@app.post("/questions/set_system_recommend") +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(...)): + set_user_collect_questions(question_id, flag) + # 提示保存成功 + return {"success": True, "message": "保存成功"} + +# 查询有哪些系统推荐问题 +@app.get("/questions/get_system_recommend") +def get_system_recommend(): + # 查询所有系统推荐问题 + system_recommend_questions = get_system_recommend_questions() + # 返回查询结果 + return {"success": True, "data": system_recommend_questions} + +# 查询有哪些用户收藏问题 +@app.get("/questions/get_user_collect") +def get_user_collect(): + # 查询所有用户收藏问题 + user_collect_questions = get_user_collect_questions() + # 返回查询结果 + return {"success": True, "data": user_collect_questions} # 启动 FastAPI if __name__ == "__main__": uvicorn.run("app:app", host="0.0.0.0", port=8000, reload=True) \ No newline at end of file