ezKit 1.12.12__py3-none-any.whl → 1.12.14__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 +47 -24
- {ezkit-1.12.12.dist-info → ezkit-1.12.14.dist-info}/METADATA +1 -1
- {ezkit-1.12.12.dist-info → ezkit-1.12.14.dist-info}/RECORD +6 -6
- {ezkit-1.12.12.dist-info → ezkit-1.12.14.dist-info}/WHEEL +0 -0
- {ezkit-1.12.12.dist-info → ezkit-1.12.14.dist-info}/licenses/LICENSE +0 -0
- {ezkit-1.12.12.dist-info → ezkit-1.12.14.dist-info}/top_level.txt +0 -0
ezKit/database.py
CHANGED
@@ -10,11 +10,11 @@
|
|
10
10
|
import csv
|
11
11
|
import json
|
12
12
|
from datetime import date, datetime
|
13
|
-
from typing import Any, Type
|
13
|
+
from typing import Any, Dict, Optional, Tuple, Type
|
14
14
|
|
15
15
|
import pandas as pd
|
16
16
|
from loguru import logger
|
17
|
-
from sqlalchemy import CursorResult, Engine, Index, create_engine, text
|
17
|
+
from sqlalchemy import CursorResult, Engine, Index, bindparam, create_engine, text
|
18
18
|
from sqlalchemy.orm import DeclarativeBase, Session, declarative_base
|
19
19
|
|
20
20
|
from . import utils
|
@@ -109,21 +109,23 @@ def orm_to_dict(obj, include: list | None = None) -> dict | list | None:
|
|
109
109
|
# --------------------------------------------------------------------------------------------------
|
110
110
|
|
111
111
|
|
112
|
-
def
|
112
|
+
def build_sqlalchemy_where_clause(data: dict) -> Optional[Tuple[str, Dict[str, Any], list]]:
|
113
113
|
"""
|
114
|
-
|
115
|
-
|
116
|
-
|
114
|
+
构建 SQLAlchemy 原生 SQL 查询的 WHERE 子句与绑定参数 (text + :param_name)
|
115
|
+
- 支持操作符: __like, __ge, __gt, __lt, __ne, __in, __between
|
116
|
+
- 支持 PostgreSQL 对 date 字段的特殊处理
|
117
|
+
- 返回: (SQL 子句字符串, 参数 dict, bindparams 列表)
|
117
118
|
"""
|
118
119
|
|
119
120
|
try:
|
120
121
|
|
121
122
|
sql_parts = []
|
122
|
-
|
123
|
+
param_dict = {}
|
124
|
+
bind_params = []
|
123
125
|
|
124
126
|
for field, value in data.items():
|
125
127
|
|
126
|
-
#
|
128
|
+
# 特殊处理日期字段
|
127
129
|
if field == "date" or field.startswith("date__"):
|
128
130
|
field = field.replace("date", "datetime::date", 1)
|
129
131
|
|
@@ -131,34 +133,55 @@ def build_raw_where_clause(data: dict) -> tuple[str, list] | None:
|
|
131
133
|
|
132
134
|
base, op = field.split("__", 1)
|
133
135
|
|
136
|
+
# 避免字段名冲突
|
137
|
+
param_key = f"{base}_{op}"
|
138
|
+
|
139
|
+
# 特殊处理日期字段
|
140
|
+
if param_key.startswith("datetime::date"):
|
141
|
+
param_key = param_key.replace("datetime::date", "datetime_date", 1)
|
142
|
+
|
134
143
|
if op == "like":
|
135
|
-
sql_parts.append(f"{base} LIKE
|
136
|
-
|
144
|
+
sql_parts.append(f"{base} LIKE :{param_key}")
|
145
|
+
param_dict[param_key] = f"%{value}%"
|
146
|
+
elif op == "ge":
|
147
|
+
sql_parts.append(f"{base} >= :{param_key}")
|
148
|
+
param_dict[param_key] = value
|
137
149
|
elif op == "gt":
|
138
|
-
sql_parts.append(f"{base} >
|
139
|
-
|
150
|
+
sql_parts.append(f"{base} > :{param_key}")
|
151
|
+
param_dict[param_key] = value
|
152
|
+
elif op == "le":
|
153
|
+
sql_parts.append(f"{base} <= :{param_key}")
|
154
|
+
param_dict[param_key] = value
|
140
155
|
elif op == "lt":
|
141
|
-
sql_parts.append(f"{base} <
|
142
|
-
|
156
|
+
sql_parts.append(f"{base} < :{param_key}")
|
157
|
+
param_dict[param_key] = value
|
143
158
|
elif op == "ne":
|
144
|
-
sql_parts.append(f"{base} !=
|
145
|
-
|
159
|
+
sql_parts.append(f"{base} != :{param_key}")
|
160
|
+
param_dict[param_key] = value
|
146
161
|
elif op == "in" and isinstance(value, list):
|
147
|
-
|
148
|
-
|
149
|
-
|
162
|
+
sql_parts.append(f"{base} IN :{param_key}")
|
163
|
+
param_dict[param_key] = value
|
164
|
+
bind_params.append(bindparam(param_key, expanding=True))
|
150
165
|
elif op == "between" and isinstance(value, list) and len(value) == 2:
|
151
|
-
sql_parts.append(f"{base} BETWEEN
|
152
|
-
|
166
|
+
sql_parts.append(f"{base} BETWEEN :{param_key}_start AND :{param_key}_end")
|
167
|
+
param_dict[f"{param_key}_start"] = value[0]
|
168
|
+
param_dict[f"{param_key}_end"] = value[1]
|
153
169
|
|
154
170
|
else:
|
155
171
|
|
156
|
-
|
157
|
-
|
172
|
+
param_key = field
|
173
|
+
|
174
|
+
# 特殊处理日期字段
|
175
|
+
if param_key.startswith("datetime::date"):
|
176
|
+
param_key = param_key.replace("datetime::date", "datetime_date", 1)
|
177
|
+
|
178
|
+
sql_parts.append(f"{field} = :{param_key}")
|
179
|
+
|
180
|
+
param_dict[param_key] = value
|
158
181
|
|
159
182
|
where_clause = " AND ".join(sql_parts)
|
160
183
|
|
161
|
-
return where_clause,
|
184
|
+
return where_clause, param_dict, bind_params
|
162
185
|
|
163
186
|
except Exception as e:
|
164
187
|
logger.exception(e)
|
@@ -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=HK-TquMmlzPlRsiqmnXTGxQrrSHiRx65oOHoE6c4M84,19926
|
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.14.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
19
|
+
ezkit-1.12.14.dist-info/METADATA,sha256=aXP1h-OH37Q4mhrUOAW9WnN6sUkEiz4Mvf5swf--IbY,317
|
20
|
+
ezkit-1.12.14.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
21
|
+
ezkit-1.12.14.dist-info/top_level.txt,sha256=aYLB_1WODsqNTsTFWcKP-BN0KCTKcV-HZJ4zlHkCFw8,6
|
22
|
+
ezkit-1.12.14.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|