From 97d8e70b54b03570d39f645e52cb0727c8d02f92 Mon Sep 17 00:00:00 2001 From: HuangHai <10402852@qq.com> Date: Sun, 16 Mar 2025 14:51:27 +0800 Subject: [PATCH] 'commit' --- AI/Config.py | 7 + .../Model/__pycache__/biModel.cpython-310.pyc | Bin 2545 -> 1872 bytes AI/Text2Sql/Model/biModel.py | 130 +++++++-------- AI/Text2Sql/Util/PostgreSQLUtil.py | 72 ++++---- .../PostgreSQLUtil.cpython-310.pyc | Bin 3402 -> 2830 bytes AI/Text2Sql/__pycache__/app.cpython-310.pyc | Bin 3072 -> 3577 bytes AI/Text2Sql/app.py | 156 +++++++++++------- .../1b89c2b4-57ed-4b0c-bf49-864727f0010c.xlsx | Bin 0 -> 6474 bytes .../7ba5cf31-06fc-4b30-bf74-242461883ac0.xlsx | Bin 0 -> 6475 bytes .../96d090d3-658f-4a5f-9e0c-178a856d9458.xlsx | Bin 0 -> 6475 bytes AI/__pycache__/Config.cpython-310.pyc | Bin 1245 -> 1383 bytes 11 files changed, 201 insertions(+), 164 deletions(-) create mode 100644 AI/Text2Sql/static/1b89c2b4-57ed-4b0c-bf49-864727f0010c.xlsx create mode 100644 AI/Text2Sql/static/7ba5cf31-06fc-4b30-bf74-242461883ac0.xlsx create mode 100644 AI/Text2Sql/static/96d090d3-658f-4a5f-9e0c-178a856d9458.xlsx diff --git a/AI/Config.py b/AI/Config.py index bff3493d..4a4ee78e 100644 --- a/AI/Config.py +++ b/AI/Config.py @@ -34,3 +34,10 @@ DIFY_URL='http://10.10.14.207/v1' # Vanna Postgresql VANNA_POSTGRESQL_URI = "postgresql://postgres:DsideaL147258369@10.10.14.71:5432/szjz_db" + +# Postgresql配置信息 +PG_HOST="10.10.14.71" +PG_PORT=5432 +PG_DATABASE="szjz_db" +PG_USER="postgres" +PG_PASSWORD="DsideaL147258369" \ No newline at end of file diff --git a/AI/Text2Sql/Model/__pycache__/biModel.cpython-310.pyc b/AI/Text2Sql/Model/__pycache__/biModel.cpython-310.pyc index 8e9bf588ea80cc39effa6d73e8b430c195cf956c..6722895ff0ddb6dfbadeab1455353f4fe492752c 100644 GIT binary patch literal 1872 zcma)7&2Jk;6rY)0uRrop6p4WNsPb9{%gk=;to{hC+<8@}% zO>C`EP;)@EK=}|0cMcWr?b>eaaA4LmJ3I5{&F{VU zd(ZaBNQ^)`JM(+#T7-~4@#A84zkHR%}Z{M=$DUHf5UN0BecZu=sP{Z{c@qW>oZJEC zG|4`hC0EgPiX7oehH$k>d5CMUt29}#yH6V`54-9vuz62ugdC7=s{3%xr6u|VX=wE* zxIW~DTn!z*M0hjcP#B8pkEpHVdL8llsw@+lRN` z2`=v4*ZTN+Yx{m6E)1tC%1J#CY2W<5b>nvX-5ag`GC2Yc)_D<9=$TilGqeCi%!vAuS~y)TCtLxCiQr= z!ja28Lsx2GYhuc>iv>$gCmx+TS7(!YA4*iwLx}~bgeb!eAOR2q0{c-1T|ML%lK>+V z!yxK~R!zg=CsA6a3{budQa;M@|ADf1s{WksO{B}>rP&!MaedXTx0y+0_4?Dj&yz(j zTg5yIg4O!^$HRNyB=vMW;)P5|cIl~a*=E^O*Nhs>@pezUQm~*>3oKY(G__SUDp<9> zP(_$!Cmwl}(ViBNCO6V?zV8Z|i%G*-E?R}EG&}_o-P3%gN{-KBeRXV)c; ziUdku`ya|9FFf)O_yI^f%_BVZFYp5AjAMIST7<;fd;FcVGiNT}nQxsn8V-T$mtTJy zYykQLo$_UZvjKPh7z`tf#w4L0rHHjyOLR|949`eR&rB@ON-AC@u{~Qo*W+s9c#gsb z;F?zhY8ob6VX7L8AJkq@;caDhHVm7NjB%b>@VGgT3B&^0;N4nPrzs?%q zH#h}<0sJOwf!|X8B6GW>(|!W8BpoWNmxG*N&lrz8mTZKA2L<W+b zP76NZLR#HIMCm}*yGano)2OipeIS*~co+vFD5Cq^??YOM)pMTbQI;mbT`ms47-o4f z5InyZpBd)kFdGim)>l@h(e@t4OFJD|;zi|HC+Dd-- z^`X!D*E+g%f>Du$S&~GBtRlW0kMcXx=tn6Fadp#+0qVoOqNGPh-^6xxr1Q!AFO>u)wP@Tb{PZC}6I?QLHFa<}ucw0%Df67Kub@%Kq?89InL=LLU3KBUlB_wmeEHIL|Z>x`GcgnBgoU z@chWyu{;zJWUEHGpO5o`C(;236Nq_Or~^?l3(!w2fq50~{2eehF=$hBX_MAxA9seD z5MQ9G$3ISi4!t)p%}-#ar(lnOMjDJ>0+sbl4rhSrfDNyr;-3fl_T z6s}&HcirP`IUV6R_sFYW$YMZG~NIgL*65rHa0yWLBJpb*Lg0 zZvxsCZ=wG-8r&%HE}HkyypINzOLWkDh~^BMkI*cG=`0A`VeuN8*TF!w6+*UrKS
  • VrIkR(x zgI%PcZxv8GWS1&!Gnt`q6%@o|$TU?d2kNIVsvM}F!l-g4L#FXXGMJ4@0Yj#-cvQ7ANsNC#vuh{HQP84EnZ zbInwGsZ?^JFU@(&*5){67&*OmE;H81>pzs-X%@ lP33v(k@lsDu78H_h8*7vb#hwOtD)O^Q@6mnwtHg9{To2&J%a!M diff --git a/AI/Text2Sql/Model/biModel.py b/AI/Text2Sql/Model/biModel.py index 24412b07..91d9db91 100644 --- a/AI/Text2Sql/Model/biModel.py +++ b/AI/Text2Sql/Model/biModel.py @@ -1,78 +1,70 @@ -from pydantic import BaseModel -from sqlalchemy import create_engine, Column, Integer, String, SmallInteger, Date -from sqlalchemy.orm import declarative_base # 更新导入路径 -from sqlalchemy.orm import sessionmaker +from Text2Sql.Util.PostgreSQLUtil import PostgreSQLUtil -# 数据库连接配置 -DATABASE_URL = "postgresql+psycopg2://postgres:DsideaL147258369@10.10.14.71:5432/szjz_db" -# 创建数据库引擎 -engine = create_engine(DATABASE_URL) +# 删除数据 +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,)) -# 创建 SessionLocal 类 -SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) -# 创建 Base 类 -Base = declarative_base() +# 插入数据 +def insert_question(db, 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)) -# 获取数据库会话 -def get_db(): - db = SessionLocal() - try: - yield db - finally: - db.close() -# 定义 t_bi_question 表模型 -class TBIQuestion(Base): - __tablename__ = "t_bi_question" +# 修改数据 +''' +示例: +# 更新 question 和 state_id 字段 +update_question_by_id(db, question_id=1, question="新的问题描述", state_id=1) + +# 只更新 excel_file_name 字段 +update_question_by_id(db, question_id=1, excel_file_name="new_excel.xlsx") + +# 只更新 is_collect 字段 +update_question_by_id(db, question_id=1, is_collect=1) - id = Column(Integer, primary_key=True, index=True) - question = Column(String(255), nullable=False) - state_id = Column(SmallInteger, nullable=False, default=0) - sql = Column(String(2048)) - bar_chart_x_columns = Column(String(255)) - bar_chart_y_columns = Column(String(255)) - pie_chart_category_columns = Column(String(255)) - pie_chart_value_column = Column(String(255)) - session_id = Column(String(255), nullable=False) - excel_file_name = Column(String(255)) - bar_chart_file_name = Column(String(255)) - pie_chart_file_name = Column(String(255)) - report_file_name = Column(String(255)) - create_time = Column(Date, nullable=False, default="CURRENT_TIMESTAMP") - is_system = Column(SmallInteger, nullable=False, default=0) - is_collect = Column(SmallInteger, nullable=False, default=0) +# 不更新任何字段(因为所有参数都是 None) +update_question_by_id(db, question_id=1, question=None, state_id=None) +''' -# 创建 Pydantic 模型 -class TBIQuestionCreate(BaseModel): - question: str - state_id: int = 0 - sql: str = None - bar_chart_x_columns: str = None - bar_chart_y_columns: str = None - pie_chart_category_columns: str = None - pie_chart_value_column: str = None - session_id: str - excel_file_name: str = None - bar_chart_file_name: str = None - pie_chart_file_name: str = None - report_file_name: str = None - is_system: int = 0 - is_collect: int = 0 -class TBIQuestionUpdate(BaseModel): - question: str = None - state_id: int = None - sql: str = None - bar_chart_x_columns: str = None - bar_chart_y_columns: str = None - pie_chart_category_columns: str = None - pie_chart_value_column: str = None - session_id: str = None - excel_file_name: str = None - bar_chart_file_name: str = None - pie_chart_file_name: str = None - report_file_name: str = None - is_system: int = None - is_collect: int = None \ No newline at end of file +def update_question_by_id(db: PostgreSQLUtil, question_id: str, **kwargs): + """ + 根据主键更新 t_bi_question 表,只更新非 None 的字段 + :param db: PostgreSQLUtil 实例 + :param question_id: 主键 id + :param kwargs: 需要更新的字段和值 + :return: 更新是否成功 + """ + # 过滤掉值为 None 的字段 + update_fields = {k: v for k, v in kwargs.items() if v is not None} + if not update_fields: + return False # 没有需要更新的字段 + + # 动态构建 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 diff --git a/AI/Text2Sql/Util/PostgreSQLUtil.py b/AI/Text2Sql/Util/PostgreSQLUtil.py index e4af0bc9..62c244f1 100644 --- a/AI/Text2Sql/Util/PostgreSQLUtil.py +++ b/AI/Text2Sql/Util/PostgreSQLUtil.py @@ -1,41 +1,26 @@ -import psycopg2 -from psycopg2 import OperationalError -from psycopg2.extras import RealDictCursor import json from datetime import date, datetime +import psycopg2 +from psycopg2 import pool +from psycopg2.extras import RealDictCursor +from Config import * -class PostgreSQLUtil: - def __init__(self, host="10.10.14.71", port=5432, - dbname="szjz_db", user="postgres", password="DsideaL147258369"): - self.conn_params = { - "host": host, - "port": port, - "dbname": dbname, - "user": user, - "password": password - } - self.connection = None - - def __enter__(self): - self.connect() - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - self.close() +# 创建连接池 +postgresql_pool = psycopg2.pool.SimpleConnectionPool( + minconn=1, + maxconn=10, + host=PG_HOST, + port=PG_PORT, + dbname=PG_DATABASE, + user=PG_USER, + password=PG_PASSWORD +) - def connect(self): - try: - self.connection = psycopg2.connect(**self.conn_params) - print("成功连接到PostgreSQL数据库") - except OperationalError as e: - print(f"连接错误: {e}") - raise - def close(self): - if self.connection: - self.connection.close() - print("数据库连接已关闭") +class PostgreSQLUtil: + def __init__(self, connection): + self.connection = connection def execute_query(self, sql, params=None, return_dict=True): """执行查询并返回结果""" @@ -77,13 +62,32 @@ class PostgreSQLUtil: raise TypeError(f"Type {type(obj)} not serializable") +def get_db(): + connection = postgresql_pool.getconn() + try: + yield PostgreSQLUtil(connection) + finally: + postgresql_pool.putconn(connection) + + # 使用示例 if __name__ == "__main__": - with PostgreSQLUtil() as db: + ''' + db_gen = get_db():调用生成器函数,返回生成器对象。 + db = next(db_gen):从生成器中获取 PostgreSQLUtil 实例。 + 生成器函数确保连接在使用后正确归还到连接池。 + ''' + # 从生成器中获取数据库实例 + db_gen = get_db() + db = next(db_gen) + try: # 示例查询 result = db.execute_query("SELECT version()") print("数据库版本:", result) # 返回JSON json_data = db.query_to_json("SELECT * FROM t_base_class LIMIT 2") - print("JSON结果:", json_data) \ No newline at end of file + print("JSON结果:", json_data) + finally: + # 手动关闭生成器 + db_gen.close() diff --git a/AI/Text2Sql/Util/__pycache__/PostgreSQLUtil.cpython-310.pyc b/AI/Text2Sql/Util/__pycache__/PostgreSQLUtil.cpython-310.pyc index b14096aaf4ce68b7e242fc39c1f12b5941ed1dd7..8db3211520cce835dd67d009be51d92198d8b2a7 100644 GIT binary patch delta 1539 zcmZ8h%}?A$6rUM;ZLjwO*bpe7R%%5XEuth!qKY;V3IUWJDxi2%q){bn@k}-be`V|y z1W|1(xV9G`dWBm#7oftD_3aBbe#00D=e_5RPva(2#K!QcmfR*SH3}7HFZ)^^((rN@#GS zlq-SRAyV7bcP(KEQ&y!dYjRMR4Pkw2^5zpFs=_`Y!ainvMASt6gz!;0CK`K8$tsbf z$Aq`!4cR)TeEe`mj-TEX%`?g;ij3~ zms-2Ea{*bA^)@SX(amIGA!dFk+qBS=I1b?5+>+g3)%UWMzDi>S44u26u?^`Jp#i1D*N^%%4nSr}e<7^;$gZ_N+hMyk4Y;K>B@DJqHbqpYx090WUEZ?A2tvC@3{ zA}EZctGZ#zYf5H)6}cFMdIvw7N~ZlFOA9K8o@annWeN>>AiaJj-4}hSUQPj@E&}Mx zpf=4PSAU{&`QO#qd+0`efN%?-?5ghn%h4!pxLNG(rg3yX->`o+u+B=$r)syxuNO}( zz?YBnPVKhM);p>RTHDHhsJ%ZJ$1QURcL0idnsqbZ3uX2^7UixheoLE}h-v^}sna@u zMJ#G-_6(~uY5C<^pJI>W^+z(j3-Are$SFM|Uy;K`Heg5On0^5lYa40ph@6#w0_Tdh zPlf^O#Yi&jRX6|_?-e(D5;`J^O1Ioh`a^95++2yfti1tCU9q!_Vc?ZxUt5$>qfV!p zdXO*G{lScy$9;II6jrjZlJun)C%wB$2bGV!Ru|+!rn;%B;38usj-L5FKJNHo5=hW4 z@55#p;N}ze(+#J?O%OIWwmQ59!s>Eo`SG%|RwJl@^?&h-NY;SC>s!uQktg(84 z@DTtv#E#pO@K=byd%?s`d1{3*>^3!v3(F&{Vn4X>3+fgXFNo92F1+3lh4nCuML&>B ucs^wpE?Q)iTC7g%)S`yQpgM0Je6`z^?a(iEVc3ju_R^Vz>saKE{r%4;EC@LfYQn?O^jVw+^tM$&?=zqG-b7tpIRejL3b$tl@`U^qU$#FEygUO<{R#vpoQ9-=zbqtGTA>vCM#!p0 z#n62kniUhq%+RXZ6}xIxEK0sbxW(;d!tEti$q0vM&NF#NWR}R4FI2K3yOQJ1Dy`&2 zfoDa2iBSS$T|5V4MHtJAB92YK?j|wG67EFD$PiJ_&VdE^_dRGhhOJz<1GbXUGEI6; z*M;=rAgX!cNhu=??ft|kz(x3$amu){3JhgU=aTg4L&_|=g7l^BpKD5ZMu9aaq6k6 zN_tMHfD3PA=+MJbnv+F~uEWwtC%uUReP!V!W5r@#a@ zTDB7N94wuf^+?8v&8KQ!RU~FZ2??8eO3g)*18R9cs@2@OC%vjla`+;AM7nGzrV`<_ zEWl>63q=t{H;Nt*H;C+mpHB{-7@p*6B9iAP&jhuZk*GE^`Snwi<6=HOICdeNL!LTx1mRGVHupTR{id3aDq9csKXZRP2Dux) zf(4czMoN@Ty?^3}dEbo}>LSTt?|CmwY&|s9X&OKz<`JSju#UoQ3iLBzNp*I>g1VRx zG%O>~Y3_>2EagT3z|69D=_?etV#Fq=OAvYxl3=b$Vr$_sN)}A*MEqHmG68EU); z8jJJ=I!EV7*&J;Qz?y3pUv2;7osEyKuf6hK`{Mie@mhQ1{k6-#Yu|dUfybIE+In|+-IBVR_xcQ7pj6Yxk4oLvI* zo0pn1Xzna+88REQ8s(I;%k;|GMYCnD7?>bdA>X#lSyPU1gPY5`e*!YqCFreKt7OrF zxrbZU1d#ZCR-OPtXdr9^VvM{*rYU58bJ=NGIQ#RpxeYsJg8!ohS$}GK)}J7?y+A-` z;fFv#8wl7HXL+V&ZxK-2lS6xeigeL_!A2@>w-al|eXD_{P6N+k?b5F|R$pFw=e>=a zzij{cj~gGo-hS))`iHNrUB3p|p;Gj9`EaK_KaS+W4vruPF~G+Vay-Zx*x>v2B5gsI z-AjJPE-=WoR3evBUbBP^9)Ln5l;3gkN$zMEsMwFH^5exT1 zL&$}}qhaKGp*jYgt;r8qh*bd-o7x9LTbNy>F^TC#s1ZvLy{VmB2AUjdW@0phI)oQe zF)?H`cSGmNuu-k4ZESrEJ|DrQ(b#WQ`;S6@-`|S6ilC=c%zxS6_w_d)`Mjg^(fO?hNrdem+BFrkfi_F3#6xqP+!x;{i8!sP14R z#=$)|pMaMb;w7drn`TQ)=Akqjs}M|Bbz-=&EJ1bQ>}_L-zDUc4E-CGIm)BqYv3C0E z%Gw8Sv~OK$U%c9W`RD6zF0cRo!}j%`Hmz|eou%fkQZ0&0TaJ2Dp@5>23sg{3u~+kj zL_?$nBFP3SnvP`Ei<2x));Gw+#1af}8qw5j2OM%3rhOZl!q_Sr4iuQ?7duY76KG3f zhL)JuC0=PHCTj_IalDO<0>=`>ba`O0i>3Ja)gzDqv1{T?SWpDk`#kFg{8Ey`2sy$Kq=GoKFm11|w zQ^NH_xLKA)PCa*OymYXE-s54W+#N1=%My&}+MaZ8T>u8*q9{G3vxUTf)Tfr7ADSk= z0U}|1Dy6%fhIm?H5sXS!A4LbP?}3mwM^l`SAw6~UIdG3EK%DnbINMVW&9NNK83j7< Hv3d7@Vqi}= diff --git a/AI/Text2Sql/__pycache__/app.cpython-310.pyc b/AI/Text2Sql/__pycache__/app.cpython-310.pyc index 237a087d0e4c254b4caf6a9d26add4ac82974cab..25220213694fdb07e427bbe84f4bd38488bfa9ca 100644 GIT binary patch literal 3577 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 literal 3072 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 Z#jTWN(UEO+000|#f|2q2l=S!8{{XuUero^# literal 0 HcmV?d00001 diff --git a/AI/Text2Sql/static/7ba5cf31-06fc-4b30-bf74-242461883ac0.xlsx b/AI/Text2Sql/static/7ba5cf31-06fc-4b30-bf74-242461883ac0.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..6419fb1bb13b89df4f3ce6a90508a744279ccbee GIT binary patch literal 6475 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 c$N+%rIAhrq@@v%7^J~F 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 Cs!TWl delta 136 zcmaFPb(fPbpO=@50SN4FUrBFeoyaG{m^V>7pCy<o$2e}3Z`T*rTS27gw0L>`knZ#<$s5aSzRh@~082}dhC?@~_