ezKit 1.12.23__py3-none-any.whl → 1.12.24__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
ezKit/database.py CHANGED
@@ -14,7 +14,7 @@ from typing import Any, Dict, List, Optional, Tuple, Type
14
14
 
15
15
  import pandas as pd
16
16
  from loguru import logger
17
- from sqlalchemy import CursorResult, Engine, Index, bindparam, create_engine, insert, text
17
+ from sqlalchemy import CursorResult, Engine, Index, bindparam, create_engine, text
18
18
  from sqlalchemy.engine import Result
19
19
  from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker
20
20
  from sqlalchemy.orm import DeclarativeBase, Session, declarative_base
@@ -190,6 +190,67 @@ def build_sqlalchemy_where_clause(data: dict) -> Optional[Tuple[str, Dict[str, A
190
190
  return None
191
191
 
192
192
 
193
+ def build_sqlalchemy_select_where(data: dict) -> tuple | None:
194
+ """Build SQLAlchemy select WHERE"""
195
+
196
+ try:
197
+
198
+ # 获取分页参数 (从 data 中取出 pageIndex 和 pageSize, 剩余的为查询参数)
199
+
200
+ pageIndex = data.pop("pageIndex", 1)
201
+ pageSize = data.pop("pageSize", 10)
202
+
203
+ limit, offset = get_limit_offset(pageIndex, pageSize)
204
+
205
+ # 构建 WHERE
206
+
207
+ build_result = build_sqlalchemy_where_clause(data)
208
+
209
+ if build_result is None:
210
+ logger.error("Build SQLAlchemy WHERE clause error")
211
+ return None
212
+
213
+ where_clause, sql_params, bind_params = build_result
214
+
215
+ # 添加 WHERE 前缀
216
+ if isinstance(where_clause, str) and where_clause.strip():
217
+ where_clause = f"WHERE {where_clause.strip()}"
218
+
219
+ # 分页参数
220
+ sql_params["limit"] = limit
221
+ sql_params["offset"] = offset
222
+
223
+ return where_clause, sql_params, bind_params
224
+
225
+ except Exception as e:
226
+ logger.exception(e)
227
+ return None
228
+
229
+
230
+ def build_sqlalchemy_update(tablename: str, where_data: dict, update_data: dict) -> tuple | None:
231
+ """Build SQLAlchemy update"""
232
+
233
+ # 构建 WHERE
234
+
235
+ build_result = build_sqlalchemy_where_clause(where_data)
236
+
237
+ if build_result is None:
238
+ logger.error("Build SQLAlchemy WHERE clause error")
239
+ return None
240
+
241
+ where_clause, sql_params, bind_params = build_result
242
+
243
+ # 构建 UPDATE SQL 语句 (SET 中 key 的 value 的 key 添加后缀 _value, 避免与 where 冲突)
244
+ sql: str = f"UPDATE {tablename} SET " + ", ".join([f"{k} = :{k}_value" for k in update_data.keys()]) + f" WHERE {where_clause}"
245
+
246
+ # 合并数据 (key 添加后缀 _value, 与 SQL 保持一致)
247
+ for k in update_data.keys():
248
+ sql_params[f"{k}_value"] = update_data[k]
249
+
250
+ # 返回 statement 和 params
251
+ return text(sql).bindparams(*bind_params), sql_params
252
+
253
+
193
254
  # --------------------------------------------------------------------------------------------------
194
255
 
195
256
 
@@ -604,7 +665,7 @@ class DatabaseAsyncSession:
604
665
 
605
666
  # 执行器 (CRUD都可以执行. 即可以执行原生SQL, 也可以执行ORM)
606
667
  # statement: SQL 或者 insert(schema)等
607
- # params: List[dict]
668
+ # params: List[dict] (非必要)
608
669
  async def operater(self, statement, params: Any | None = None, **kwargs) -> Result | None:
609
670
 
610
671
  async with self.AsyncSessionLocal() as session:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ezKit
3
- Version: 1.12.23
3
+ Version: 1.12.24
4
4
  Summary: Easy Kit
5
5
  Author: septvean
6
6
  Author-email: septvean@gmail.com
@@ -3,7 +3,7 @@ ezKit/_file.py,sha256=0qRZhwYuagTgTGrhm-tzAMvEQT4HTJA_xZKqF2bo0ho,1207
3
3
  ezKit/bottle.py,sha256=43h4v1kzz6qrLvCt5IMN0H-gFtaT0koG9wETqteXsps,181666
4
4
  ezKit/bottle_extensions.py,sha256=27rogmfK7mL2qUSjXH79IMGZbCVULtYEikql_N9O6Zs,1165
5
5
  ezKit/cipher.py,sha256=7jBarRH7ukSYzkz-Anl8B8JzluhnRz4CLHidPRRj_cg,2939
6
- ezKit/database.py,sha256=ZvyxBr-_3XNTuyJTM_5HUJqeyAmLI-ftDAKTyab5wsw,21732
6
+ ezKit/database.py,sha256=5-hKwdRmjkvjaMR-c0Y71YL4RP8RZQMwcvTSRkDR12M,23625
7
7
  ezKit/dockerhub.py,sha256=j-wQO-71BsOgExHZhYynuy2k_hCX3on-vg0TH7QCit4,1996
8
8
  ezKit/http.py,sha256=zhNxJF-x91UqGncXWxVXnhZVpFo_wmmpGnMXVT11y9E,1832
9
9
  ezKit/markdown_to_html.template,sha256=21G2sSVGJn6aJvHd0NN4zY5YiDteKe4UtW36AzBwSdk,22274
@@ -15,8 +15,8 @@ ezKit/token.py,sha256=Ac-i9xfq4TqpGyfCzakjrh4NYzxHiN2sCQrMk1tzVi8,1716
15
15
  ezKit/utils.py,sha256=U457ahFkxIXuB-qWvS3995xJs-LlkFIX5_ZWVgmL5cY,43130
16
16
  ezKit/xftp.py,sha256=-XQXyhMqeigT63P6sXkSS7r4GROXyqqlkzKxITLWG-g,8278
17
17
  ezKit/zabbix.py,sha256=PkMnfu7mcuotwwIIsHaC9FsNg-gap6hD1xvm0AwSL1Y,33777
18
- ezkit-1.12.23.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
19
- ezkit-1.12.23.dist-info/METADATA,sha256=_uyFQwYed7tO-PoyfSnn5cEAQAz7lHU5thsZaegrOfo,317
20
- ezkit-1.12.23.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
21
- ezkit-1.12.23.dist-info/top_level.txt,sha256=aYLB_1WODsqNTsTFWcKP-BN0KCTKcV-HZJ4zlHkCFw8,6
22
- ezkit-1.12.23.dist-info/RECORD,,
18
+ ezkit-1.12.24.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
19
+ ezkit-1.12.24.dist-info/METADATA,sha256=hMehrY5rKRa8oHbzOJarQMHyPfyHVeJ3JlFFhNdYNbo,317
20
+ ezkit-1.12.24.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
21
+ ezkit-1.12.24.dist-info/top_level.txt,sha256=aYLB_1WODsqNTsTFWcKP-BN0KCTKcV-HZJ4zlHkCFw8,6
22
+ ezkit-1.12.24.dist-info/RECORD,,