ezKit 1.12.22__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 +66 -5
- {ezkit-1.12.22.dist-info → ezkit-1.12.24.dist-info}/METADATA +1 -1
- {ezkit-1.12.22.dist-info → ezkit-1.12.24.dist-info}/RECORD +6 -6
- {ezkit-1.12.22.dist-info → ezkit-1.12.24.dist-info}/WHEEL +0 -0
- {ezkit-1.12.22.dist-info → ezkit-1.12.24.dist-info}/licenses/LICENSE +0 -0
- {ezkit-1.12.22.dist-info → ezkit-1.12.24.dist-info}/top_level.txt +0 -0
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,
|
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,8 +665,8 @@ class DatabaseAsyncSession:
|
|
604
665
|
|
605
666
|
# 执行器 (CRUD都可以执行. 即可以执行原生SQL, 也可以执行ORM)
|
606
667
|
# statement: SQL 或者 insert(schema)等
|
607
|
-
# params: List[dict]
|
608
|
-
async def operater(self, statement, params, **kwargs) -> Result | None:
|
668
|
+
# params: List[dict] (非必要)
|
669
|
+
async def operater(self, statement, params: Any | None = None, **kwargs) -> Result | None:
|
609
670
|
|
610
671
|
async with self.AsyncSessionLocal() as session:
|
611
672
|
|
@@ -619,14 +680,14 @@ class DatabaseAsyncSession:
|
|
619
680
|
return None
|
620
681
|
|
621
682
|
# 精确返回一个标量结果 (适用于只返回一行数据的select, 比如 count 查询)
|
622
|
-
async def operate_return_scalar_one(self, statement, params, **kwargs) -> Any | None:
|
683
|
+
async def operate_return_scalar_one(self, statement, params: Any | None = None, **kwargs) -> Any | None:
|
623
684
|
result = await self.operater(statement, params, **kwargs)
|
624
685
|
if result is None:
|
625
686
|
return None
|
626
687
|
return result.scalar_one()
|
627
688
|
|
628
689
|
# 返回所有结果 (适用于所有select)
|
629
|
-
async def operate_return_mappings_all(self, statement, params, **kwargs) -> List[Any]:
|
690
|
+
async def operate_return_mappings_all(self, statement, params: Any | None = None, **kwargs) -> List[Any]:
|
630
691
|
result = await self.operater(statement, params, **kwargs)
|
631
692
|
if result is None:
|
632
693
|
return []
|
@@ -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=
|
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.
|
19
|
-
ezkit-1.12.
|
20
|
-
ezkit-1.12.
|
21
|
-
ezkit-1.12.
|
22
|
-
ezkit-1.12.
|
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,,
|
File without changes
|
File without changes
|
File without changes
|