ezKit 1.12.11__py3-none-any.whl → 1.12.13__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 +39 -23
- {ezkit-1.12.11.dist-info → ezkit-1.12.13.dist-info}/METADATA +1 -1
- {ezkit-1.12.11.dist-info → ezkit-1.12.13.dist-info}/RECORD +6 -6
- {ezkit-1.12.11.dist-info → ezkit-1.12.13.dist-info}/WHEEL +0 -0
- {ezkit-1.12.11.dist-info → ezkit-1.12.13.dist-info}/licenses/LICENSE +0 -0
- {ezkit-1.12.11.dist-info → ezkit-1.12.13.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,52 +109,68 @@ 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
|
|
128
|
+
# 特殊处理 PostgreSQL 日期字段
|
129
|
+
if field == "date" or field.startswith("date__"):
|
130
|
+
field = field.replace("date", "datetime::date", 1)
|
131
|
+
|
126
132
|
if "__" in field:
|
127
133
|
|
128
134
|
base, op = field.split("__", 1)
|
129
135
|
|
136
|
+
# 避免字段名冲突
|
137
|
+
param_key = f"{base}_{op}"
|
138
|
+
|
130
139
|
if op == "like":
|
131
|
-
sql_parts.append(f"{base} LIKE
|
132
|
-
|
140
|
+
sql_parts.append(f"{base} LIKE :{param_key}")
|
141
|
+
param_dict[param_key] = f"%{value}%"
|
142
|
+
elif op == "ge":
|
143
|
+
sql_parts.append(f"{base} >= :{param_key}")
|
144
|
+
param_dict[param_key] = value
|
133
145
|
elif op == "gt":
|
134
|
-
sql_parts.append(f"{base} >
|
135
|
-
|
146
|
+
sql_parts.append(f"{base} > :{param_key}")
|
147
|
+
param_dict[param_key] = value
|
148
|
+
elif op == "le":
|
149
|
+
sql_parts.append(f"{base} <= :{param_key}")
|
150
|
+
param_dict[param_key] = value
|
136
151
|
elif op == "lt":
|
137
|
-
sql_parts.append(f"{base} <
|
138
|
-
|
152
|
+
sql_parts.append(f"{base} < :{param_key}")
|
153
|
+
param_dict[param_key] = value
|
139
154
|
elif op == "ne":
|
140
|
-
sql_parts.append(f"{base} !=
|
141
|
-
|
155
|
+
sql_parts.append(f"{base} != :{param_key}")
|
156
|
+
param_dict[param_key] = value
|
142
157
|
elif op == "in" and isinstance(value, list):
|
143
|
-
|
144
|
-
|
145
|
-
|
158
|
+
sql_parts.append(f"{base} IN :{param_key}")
|
159
|
+
param_dict[param_key] = value
|
160
|
+
bind_params.append(bindparam(param_key, expanding=True))
|
146
161
|
elif op == "between" and isinstance(value, list) and len(value) == 2:
|
147
|
-
sql_parts.append(f"{base} BETWEEN
|
148
|
-
|
162
|
+
sql_parts.append(f"{base} BETWEEN :{param_key}_start AND :{param_key}_end")
|
163
|
+
param_dict[f"{param_key}_start"] = value[0]
|
164
|
+
param_dict[f"{param_key}_end"] = value[1]
|
149
165
|
|
150
166
|
else:
|
151
167
|
|
152
|
-
sql_parts.append(f"{field} =
|
153
|
-
|
168
|
+
sql_parts.append(f"{field} = :{field}")
|
169
|
+
param_dict[field] = value
|
154
170
|
|
155
171
|
where_clause = " AND ".join(sql_parts)
|
156
172
|
|
157
|
-
return where_clause,
|
173
|
+
return where_clause, param_dict, bind_params
|
158
174
|
|
159
175
|
except Exception as e:
|
160
176
|
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=5bl0LmLnC7iVqICa9imCiQLufDf2VgDul6-CoCjBlfs,19512
|
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.13.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
19
|
+
ezkit-1.12.13.dist-info/METADATA,sha256=P3xB6jEXMjydeLGZfLhpNShaXzB4ZkwbLvdgyE8pSm4,317
|
20
|
+
ezkit-1.12.13.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
21
|
+
ezkit-1.12.13.dist-info/top_level.txt,sha256=aYLB_1WODsqNTsTFWcKP-BN0KCTKcV-HZJ4zlHkCFw8,6
|
22
|
+
ezkit-1.12.13.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|