ezKit 1.12.47__py3-none-any.whl → 1.12.49__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
@@ -9,6 +9,7 @@
9
9
 
10
10
  import csv
11
11
  import json
12
+ import re
12
13
  from copy import deepcopy
13
14
  from datetime import date, datetime
14
15
  from typing import Any, Dict, List, Optional, Tuple, Type
@@ -128,6 +129,21 @@ def orm_to_dict(obj, include: list | None = None) -> dict | list | None:
128
129
  # --------------------------------------------------------------------------------------------------
129
130
 
130
131
 
132
+ def replace_datetime(source: str, to_pgsql: bool = True) -> str:
133
+ """
134
+ 替换 datetime_date <-> datetime::date
135
+ to_pgsql=True : datetime_date -> datetime::date
136
+ to_pgsql=False : datetime::date -> datetime_date
137
+ """
138
+
139
+ if to_pgsql:
140
+ pattern = re.compile(r"(^|\.)(datetime_date)(__|$)")
141
+ return pattern.sub(r"\1datetime::date\3", source, count=1)
142
+
143
+ pattern = re.compile(r"(^|\.)(datetime::date)$")
144
+ return pattern.sub(r"\1datetime_date\3", source, count=1)
145
+
146
+
131
147
  def build_sqlalchemy_where_clause(data: dict) -> Optional[Tuple[str, Dict[str, Any], list]]:
132
148
  """
133
149
  构建 SQLAlchemy 原生 SQL 查询的 WHERE 子句与绑定参数 (text + :param_name)
@@ -219,8 +235,15 @@ def build_sqlalchemy_where_clause(data: dict) -> Optional[Tuple[str, Dict[str, A
219
235
  for field, value in _data.items():
220
236
 
221
237
  # 特殊处理日期字段
222
- is_date_field = field == "datetime_date" or field.startswith("datetime_date__")
223
- base_field = field.replace("datetime_date", "datetime::date", 1) if is_date_field else field
238
+ # 如果匹配到 datetime_date 或者 .datetime_date 或者 datetime_date__ 或者 .datetime_date__ 就替换
239
+ # is_date_field = field == "datetime_date" or field.startswith("datetime_date__")
240
+ # base_field = field.replace("datetime_date", "datetime::date", 1) if is_date_field else field
241
+ pattern_date_field = re.compile(r"(^|\.)(datetime_date)(__|$)")
242
+ if pattern_date_field.search(field):
243
+ # base_field = pattern_date.sub(r"\1datetime::date\3", field, count=1)
244
+ base_field = replace_datetime(field, to_pgsql=True)
245
+ else:
246
+ base_field = field
224
247
 
225
248
  if "__" in base_field:
226
249
 
@@ -230,8 +253,11 @@ def build_sqlalchemy_where_clause(data: dict) -> Optional[Tuple[str, Dict[str, A
230
253
  param_key = f"{base.replace('.', '_')}_{op}"
231
254
 
232
255
  # 特殊处理日期字段
233
- if param_key.startswith("datetime::date"):
234
- param_key = param_key.replace("datetime::date", "datetime_date", 1)
256
+ # if param_key.startswith("datetime::date"):
257
+ # param_key = param_key.replace("datetime::date", "datetime_date", 1)
258
+ pattern_param_key = re.compile(r"(^|\.)(datetime::date)$")
259
+ if pattern_param_key.search(param_key):
260
+ param_key = replace_datetime(param_key, to_pgsql=False)
235
261
 
236
262
  if op == "like":
237
263
  sql_parts.append(f"{base} LIKE :{param_key}")
@@ -253,8 +279,12 @@ def build_sqlalchemy_where_clause(data: dict) -> Optional[Tuple[str, Dict[str, A
253
279
 
254
280
  param_key = base_field.replace(".", "_")
255
281
  # 特殊处理日期字段
256
- if param_key.startswith("datetime::date"):
257
- param_key = param_key.replace("datetime::date", "datetime_date", 1)
282
+ # 如果匹配到 datetime_date 或者 .datetime_date 或者 datetime_date__ 或者 .datetime_date__ 就替换
283
+ # if param_key.startswith("datetime::date"):
284
+ # param_key = param_key.replace("datetime::date", "datetime_date", 1)
285
+ pattern_param_key = re.compile(r"(^|\.)(datetime::date)$")
286
+ if pattern_param_key.search(param_key):
287
+ param_key = replace_datetime(param_key, to_pgsql=False)
258
288
  sql_parts.append(f"{base_field} = :{param_key}")
259
289
  param_dict[param_key] = value
260
290
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ezKit
3
- Version: 1.12.47
3
+ Version: 1.12.49
4
4
  Summary: Easy Kit
5
5
  Author: septvean
6
6
  Author-email: septvean@gmail.com
@@ -4,7 +4,7 @@ ezKit/auth.py,sha256=HO19O4qOz68e0YwOP04habxMCAk42B3D7LW7yKgm9ZA,398
4
4
  ezKit/bottle.py,sha256=43h4v1kzz6qrLvCt5IMN0H-gFtaT0koG9wETqteXsps,181666
5
5
  ezKit/bottle_extensions.py,sha256=27rogmfK7mL2qUSjXH79IMGZbCVULtYEikql_N9O6Zs,1165
6
6
  ezKit/cipher.py,sha256=7jBarRH7ukSYzkz-Anl8B8JzluhnRz4CLHidPRRj_cg,2939
7
- ezKit/database.py,sha256=fHqmFt1H81PELAsishcklzTnrvPovjgCFIVQK1aUlSA,33174
7
+ ezKit/database.py,sha256=zXhbBd378w_dW_dLlq2lmTkw8ztzQJT1KKZDlEvWPrY,34688
8
8
  ezKit/dockerhub.py,sha256=j-wQO-71BsOgExHZhYynuy2k_hCX3on-vg0TH7QCit4,1996
9
9
  ezKit/errors.py,sha256=92PggwPQfTS3Vg4og7GHYnO9CTSM7zmuh2w3kx_tSBE,1425
10
10
  ezKit/fastapix.py,sha256=-nz565ASKvp3nGs9J4wORTHxlhMozqCwv8zREWpmYtI,3382
@@ -18,8 +18,8 @@ ezKit/token.py,sha256=Ac-i9xfq4TqpGyfCzakjrh4NYzxHiN2sCQrMk1tzVi8,1716
18
18
  ezKit/utils.py,sha256=U457ahFkxIXuB-qWvS3995xJs-LlkFIX5_ZWVgmL5cY,43130
19
19
  ezKit/xftp.py,sha256=-XQXyhMqeigT63P6sXkSS7r4GROXyqqlkzKxITLWG-g,8278
20
20
  ezKit/zabbix.py,sha256=PkMnfu7mcuotwwIIsHaC9FsNg-gap6hD1xvm0AwSL1Y,33777
21
- ezkit-1.12.47.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
22
- ezkit-1.12.47.dist-info/METADATA,sha256=zxEuLOG8ERjvqvcXxepBi4Va4BItBFOt2QGi6AwnNLc,317
23
- ezkit-1.12.47.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
24
- ezkit-1.12.47.dist-info/top_level.txt,sha256=aYLB_1WODsqNTsTFWcKP-BN0KCTKcV-HZJ4zlHkCFw8,6
25
- ezkit-1.12.47.dist-info/RECORD,,
21
+ ezkit-1.12.49.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
22
+ ezkit-1.12.49.dist-info/METADATA,sha256=3NWuPiRzLrVCrmKkSL1vH8CeMra-YkfSrfq8oZ5k34o,317
23
+ ezkit-1.12.49.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
24
+ ezkit-1.12.49.dist-info/top_level.txt,sha256=aYLB_1WODsqNTsTFWcKP-BN0KCTKcV-HZJ4zlHkCFw8,6
25
+ ezkit-1.12.49.dist-info/RECORD,,