ezKit 1.12.12__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 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 build_raw_where_clause(data: dict) -> tuple[str, list] | None:
112
+ def build_sqlalchemy_where_clause(data: dict) -> Optional[Tuple[str, Dict[str, Any], list]]:
113
113
  """
114
- 将字段数据转换为 SQL WHERE 条件(使用原生 SQL)
115
- 支持字段后缀操作: __like, __gt, __lt, __ne, __in, __between
116
- 返回值: SQL字符串和参数列表 (为了避免 SQL 注入风险, 不直接返回 SQL 语句)
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
- params = []
123
+ param_dict = {}
124
+ bind_params = []
123
125
 
124
126
  for field, value in data.items():
125
127
 
126
- # PostgreSQL: 日期特殊处理
128
+ # 特殊处理 PostgreSQL 日期字段
127
129
  if field == "date" or field.startswith("date__"):
128
130
  field = field.replace("date", "datetime::date", 1)
129
131
 
@@ -131,34 +133,44 @@ 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
+
134
139
  if op == "like":
135
- sql_parts.append(f"{base} LIKE %s")
136
- params.append(f"%{value}%")
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
137
145
  elif op == "gt":
138
- sql_parts.append(f"{base} > %s")
139
- params.append(value)
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
140
151
  elif op == "lt":
141
- sql_parts.append(f"{base} < %s")
142
- params.append(value)
152
+ sql_parts.append(f"{base} < :{param_key}")
153
+ param_dict[param_key] = value
143
154
  elif op == "ne":
144
- sql_parts.append(f"{base} != %s")
145
- params.append(value)
155
+ sql_parts.append(f"{base} != :{param_key}")
156
+ param_dict[param_key] = value
146
157
  elif op == "in" and isinstance(value, list):
147
- placeholders = ", ".join(["%s"] * len(value))
148
- sql_parts.append(f"{base} IN ({placeholders})")
149
- params.extend(value)
158
+ sql_parts.append(f"{base} IN :{param_key}")
159
+ param_dict[param_key] = value
160
+ bind_params.append(bindparam(param_key, expanding=True))
150
161
  elif op == "between" and isinstance(value, list) and len(value) == 2:
151
- sql_parts.append(f"{base} BETWEEN %s AND %s")
152
- params.extend(value)
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]
153
165
 
154
166
  else:
155
167
 
156
- sql_parts.append(f"{field} = %s")
157
- params.append(value)
168
+ sql_parts.append(f"{field} = :{field}")
169
+ param_dict[field] = value
158
170
 
159
171
  where_clause = " AND ".join(sql_parts)
160
172
 
161
- return where_clause, params
173
+ return where_clause, param_dict, bind_params
162
174
 
163
175
  except Exception as e:
164
176
  logger.exception(e)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ezKit
3
- Version: 1.12.12
3
+ Version: 1.12.13
4
4
  Summary: Easy Kit
5
5
  Author: septvean
6
6
  Author-email: septvean@gmail.com
@@ -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=gHpU2E2zd3GGQpTXPkpyClySAdnab-AxTwCPyQGiAqs,18757
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.12.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
19
- ezkit-1.12.12.dist-info/METADATA,sha256=9et1FbKkXxWKuH0_yvzg4uzdolFHs8419tkwMMs4FZo,317
20
- ezkit-1.12.12.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
21
- ezkit-1.12.12.dist-info/top_level.txt,sha256=aYLB_1WODsqNTsTFWcKP-BN0KCTKcV-HZJ4zlHkCFw8,6
22
- ezkit-1.12.12.dist-info/RECORD,,
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,,