ezKit 1.12.7__py3-none-any.whl → 1.12.9__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 +60 -3
- {ezkit-1.12.7.dist-info → ezkit-1.12.9.dist-info}/METADATA +1 -1
- {ezkit-1.12.7.dist-info → ezkit-1.12.9.dist-info}/RECORD +6 -6
- {ezkit-1.12.7.dist-info → ezkit-1.12.9.dist-info}/WHEEL +0 -0
- {ezkit-1.12.7.dist-info → ezkit-1.12.9.dist-info}/licenses/LICENSE +0 -0
- {ezkit-1.12.7.dist-info → ezkit-1.12.9.dist-info}/top_level.txt +0 -0
ezKit/database.py
CHANGED
@@ -14,7 +14,7 @@ from typing import Any, Type
|
|
14
14
|
|
15
15
|
import pandas as pd
|
16
16
|
from loguru import logger
|
17
|
-
from sqlalchemy import CursorResult, Index, create_engine, text
|
17
|
+
from sqlalchemy import CursorResult, Engine, Index, create_engine, text
|
18
18
|
from sqlalchemy.orm import DeclarativeBase, Session, declarative_base
|
19
19
|
|
20
20
|
from . import utils
|
@@ -67,14 +67,71 @@ def orm_to_dict(obj, include: list | None = None) -> dict | list | None:
|
|
67
67
|
return None
|
68
68
|
|
69
69
|
|
70
|
+
def build_raw_where_clause(data: dict) -> tuple[str, list] | None:
|
71
|
+
"""
|
72
|
+
将字段数据转换为 SQL WHERE 条件(使用原生 SQL)
|
73
|
+
支持字段后缀操作: __like, __gt, __lt, __ne, __in, __between
|
74
|
+
返回值: SQL字符串和参数列表 (为了避免 SQL 注入风险, 不直接返回 SQL 语句)
|
75
|
+
"""
|
76
|
+
|
77
|
+
try:
|
78
|
+
|
79
|
+
sql_parts = []
|
80
|
+
params = []
|
81
|
+
|
82
|
+
for field, value in data.items():
|
83
|
+
|
84
|
+
if "__" in field:
|
85
|
+
|
86
|
+
base, op = field.split("__", 1)
|
87
|
+
|
88
|
+
if op == "like":
|
89
|
+
sql_parts.append(f"{base} LIKE %s")
|
90
|
+
params.append(f"%{value}%")
|
91
|
+
elif op == "gt":
|
92
|
+
sql_parts.append(f"{base} > %s")
|
93
|
+
params.append(value)
|
94
|
+
elif op == "lt":
|
95
|
+
sql_parts.append(f"{base} < %s")
|
96
|
+
params.append(value)
|
97
|
+
elif op == "ne":
|
98
|
+
sql_parts.append(f"{base} != %s")
|
99
|
+
params.append(value)
|
100
|
+
elif op == "in" and isinstance(value, list):
|
101
|
+
placeholders = ", ".join(["%s"] * len(value))
|
102
|
+
sql_parts.append(f"{base} IN ({placeholders})")
|
103
|
+
params.extend(value)
|
104
|
+
elif op == "between" and isinstance(value, list) and len(value) == 2:
|
105
|
+
sql_parts.append(f"{base} BETWEEN %s AND %s")
|
106
|
+
params.extend(value)
|
107
|
+
|
108
|
+
else:
|
109
|
+
|
110
|
+
sql_parts.append(f"{field} = %s")
|
111
|
+
params.append(value)
|
112
|
+
|
113
|
+
where_clause = " AND ".join(sql_parts)
|
114
|
+
|
115
|
+
return where_clause, params
|
116
|
+
|
117
|
+
except Exception as e:
|
118
|
+
logger.exception(e)
|
119
|
+
return None
|
120
|
+
|
121
|
+
|
122
|
+
# --------------------------------------------------------------------------------------------------
|
123
|
+
|
124
|
+
|
70
125
|
class Database:
|
71
126
|
"""Database"""
|
72
127
|
|
73
128
|
engine = create_engine("sqlite://")
|
74
129
|
|
75
|
-
def __init__(self, target: str | None = None, **options):
|
130
|
+
def __init__(self, engine: Engine | None = None, target: str | None = None, **options):
|
76
131
|
"""Initiation"""
|
77
|
-
if
|
132
|
+
if engine is not None:
|
133
|
+
self.engine = engine
|
134
|
+
elif isinstance(target, str) and utils.isTrue(target, str):
|
78
135
|
if utils.isTrue(options, dict):
|
79
136
|
self.engine = create_engine(target, **options)
|
80
137
|
else:
|
@@ -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=ELGWG865NREOPosU2vQ723juns9cWe9YM0IDAHYpfaE,17478
|
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=VyAw2yEs15VER9RCpMgskx1l0zrSpRlV34X___eOia0,42416
|
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.9.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
19
|
+
ezkit-1.12.9.dist-info/METADATA,sha256=YevXxco-dLFiNfXfl32UpHll2BRFUOQRcJ6k3JqIc_w,316
|
20
|
+
ezkit-1.12.9.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
21
|
+
ezkit-1.12.9.dist-info/top_level.txt,sha256=aYLB_1WODsqNTsTFWcKP-BN0KCTKcV-HZJ4zlHkCFw8,6
|
22
|
+
ezkit-1.12.9.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|