ezKit 1.10.5__py3-none-any.whl → 1.10.7__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
ezKit/database.py CHANGED
@@ -48,7 +48,7 @@ class Database():
48
48
  logger.success(f"{info} [success]")
49
49
  return True
50
50
  except Exception as e:
51
- logger.error(f"{info} [failure]")
51
+ logger.error(f"{info} [failed]")
52
52
  logger.exception(e)
53
53
  return False
54
54
 
@@ -64,7 +64,7 @@ class Database():
64
64
  logger.success(f"{info} [success]")
65
65
  return True
66
66
  except Exception as e:
67
- logger.error(f"{info} [failure]")
67
+ logger.error(f"{info} [failed]")
68
68
  logger.exception(e)
69
69
  return False
70
70
 
@@ -88,7 +88,7 @@ class Database():
88
88
  logger.success(f'{info} [success]')
89
89
  return True
90
90
  except Exception as e:
91
- logger.error(f'{info} [failure]')
91
+ logger.error(f'{info} [failed]')
92
92
  logger.error(e)
93
93
  return False
94
94
 
@@ -100,134 +100,227 @@ class Database():
100
100
  outcsv = csv.writer(file)
101
101
  outcsv.writerow(data.keys())
102
102
  outcsv.writerows(data)
103
+ logger.success("save to csv success")
103
104
  return True
104
105
  except Exception as e:
106
+ logger.error("save to csv failed")
105
107
  logger.exception(e)
106
108
  return False
107
109
 
108
110
  # ----------------------------------------------------------------------------------------------
109
111
 
110
- def execute(
111
- self,
112
- sql: str | None = None,
113
- sql_file: str | None = None,
114
- sql_file_kwargs: dict | None = None,
115
- csv_file: str | None = None,
116
- csv_file_kwargs: dict | None = None
117
- ) -> CursorResult[Any] | bool:
118
- """"运行"""
112
+ # def execute(
113
+ # self,
114
+ # sql: str | None = None,
115
+ # sql_file: str | None = None,
116
+ # sql_file_kwargs: dict | None = None,
117
+ # csv_file: str | None = None,
118
+ # csv_file_kwargs: dict | None = None
119
+ # ) -> CursorResult[Any] | bool:
120
+ # """"运行"""
119
121
 
120
- # ------------------------------------------------------------
122
+ # # ------------------------------------------------------------
121
123
 
122
- # 提取 SQL
123
- # 如果 sql 和 sql_file 同时存在, 优先执行 sql
124
+ # # 提取 SQL
125
+ # # 如果 sql 和 sql_file 同时存在, 优先执行 sql
124
126
 
125
- sql_object = None
127
+ # sql_object = None
126
128
 
127
- info: str = f"""Extract SQL: {sql}"""
129
+ # info: str = f"""Extract SQL: {sql}"""
128
130
 
129
- try:
131
+ # try:
130
132
 
131
- logger.info(f"{info} ......")
133
+ # logger.info(f"{info} ......")
132
134
 
133
- if utils.isTrue(sql, str):
135
+ # if utils.isTrue(sql, str):
134
136
 
135
- sql_object = sql
137
+ # sql_object = sql
136
138
 
137
- elif sql_file is not None and utils.isTrue(sql_file, str):
139
+ # elif sql_file is not None and utils.isTrue(sql_file, str):
138
140
 
139
- # 判断文件是否存在
140
- if isinstance(sql_file, str) and utils.check_file_type(sql_file, "file") is False:
141
+ # # 判断文件是否存在
142
+ # if isinstance(sql_file, str) and utils.check_file_type(sql_file, "file") is False:
141
143
 
142
- logger.error(f"No such file: {sql_file}")
143
- return False
144
+ # logger.error(f"No such file: {sql_file}")
145
+ # return False
144
146
 
145
- if isinstance(sql_file, str) and utils.isTrue(sql_file, str):
147
+ # if isinstance(sql_file, str) and utils.isTrue(sql_file, str):
146
148
 
147
- # 读取文件内容
148
- if sql_file_kwargs is not None and utils.isTrue(sql_file_kwargs, dict):
149
- with open(sql_file, "r", encoding="utf-8", **sql_file_kwargs) as _file:
150
- sql_object = _file.read()
151
- else:
152
- with open(sql_file, "r", encoding="utf-8") as _file:
153
- sql_object = _file.read()
149
+ # # 读取文件内容
150
+ # if sql_file_kwargs is not None and utils.isTrue(sql_file_kwargs, dict):
151
+ # with open(sql_file, "r", encoding="utf-8", **sql_file_kwargs) as _file:
152
+ # sql_object = _file.read()
153
+ # else:
154
+ # with open(sql_file, "r", encoding="utf-8") as _file:
155
+ # sql_object = _file.read()
154
156
 
155
- else:
157
+ # else:
156
158
 
157
- logger.error("SQL or SQL file error")
158
- logger.error(f"{info} [failure]")
159
- return False
159
+ # logger.error("SQL or SQL file error")
160
+ # logger.error(f"{info} [failed]")
161
+ # return False
160
162
 
161
- logger.success(f'{info} [success]')
163
+ # logger.success(f'{info} [success]')
162
164
 
163
- except Exception as e:
165
+ # except Exception as e:
164
166
 
165
- logger.error(f"{info} [failure]")
166
- logger.exception(e)
167
- return False
167
+ # logger.error(f"{info} [failed]")
168
+ # logger.exception(e)
169
+ # return False
168
170
 
169
- # ------------------------------------------------------------
171
+ # # ------------------------------------------------------------
170
172
 
171
- # 执行 SQL
173
+ # # 执行 SQL
172
174
 
173
- info = f"""Execute SQL: {sql_object}"""
175
+ # info = f"""Execute SQL: {sql_object}"""
174
176
 
175
- try:
177
+ # try:
176
178
 
177
- logger.info(f"{info} ......")
179
+ # logger.info(f"{info} ......")
178
180
 
179
- with self.engine.connect() as connect:
181
+ # with self.engine.connect() as connect:
180
182
 
181
- # 执行SQL
182
- if sql_object is None:
183
- return False
183
+ # # 执行SQL
184
+ # if sql_object is None:
185
+ # return False
184
186
 
185
- result = connect.execute(text(sql_object))
187
+ # result = connect.execute(text(sql_object))
186
188
 
187
- connect.commit()
189
+ # connect.commit()
188
190
 
189
- if csv_file is None:
190
- # 如果 csv_file 没有定义, 则直接返回结果
191
- logger.success(f'{info} [success]')
192
- return result
191
+ # if csv_file is None:
192
+ # # 如果 csv_file 没有定义, 则直接返回结果
193
+ # logger.success(f'{info} [success]')
194
+ # return result
193
195
 
194
- # 如果 csv_file 有定义, 则保存结果到 csv_file
195
- info_of_save = f"Save result to file: {csv_file}"
196
- logger.info(f"{info_of_save} .......")
196
+ # # 如果 csv_file 有定义, 则保存结果到 csv_file
197
+ # info_of_save = f"Save result to file: {csv_file}"
198
+ # logger.info(f"{info_of_save} .......")
197
199
 
198
- # 保存结果
199
- if isinstance(csv_file_kwargs, dict) and utils.isTrue(csv_file_kwargs, dict):
200
- with open(csv_file, "w", encoding="utf-8", **csv_file_kwargs) as _file:
201
- result_of_save = self._result_save(_file, result)
202
- else:
203
- with open(csv_file, "w", encoding="utf-8") as _file:
204
- result_of_save = self._result_save(_file, result)
200
+ # # 保存结果
201
+ # if isinstance(csv_file_kwargs, dict) and utils.isTrue(csv_file_kwargs, dict):
202
+ # with open(csv_file, "w", encoding="utf-8", **csv_file_kwargs) as _file:
203
+ # result_of_save = self._result_save(_file, result)
204
+ # else:
205
+ # with open(csv_file, "w", encoding="utf-8") as _file:
206
+ # result_of_save = self._result_save(_file, result)
205
207
 
206
- # 检查保存结果
207
- if result_of_save is True:
208
- logger.success(f'{info_of_save} [success]')
209
- logger.success(f'{info} [success]')
210
- return True
208
+ # # 检查保存结果
209
+ # if result_of_save is True:
210
+ # logger.success(f'{info_of_save} [success]')
211
+ # logger.success(f'{info} [success]')
212
+ # return True
211
213
 
212
- logger.error(f"{info_of_save} [failure]")
213
- logger.error(f"{info} [failure]")
214
- return False
214
+ # logger.error(f"{info_of_save} [failed]")
215
+ # logger.error(f"{info} [failed]")
216
+ # return False
215
217
 
216
- except Exception as e:
218
+ # except Exception as e:
219
+
220
+ # logger.error(f'{info} [failed]')
221
+ # logger.exception(e)
222
+ # return False
217
223
 
218
- logger.error(f'{info} [failure]')
224
+ # ----------------------------------------------------------------------------------------------
225
+
226
+ def connect_execute(
227
+ self,
228
+ sql: str | None = None,
229
+ read_sql_file: dict | None = None,
230
+ save_to_csv: dict | None = None
231
+ ) -> CursorResult[Any] | bool | None:
232
+
233
+ info: str = 'Database connect execute'
234
+
235
+ logger.info(f"{info} ......")
236
+
237
+ sql_statement: str = ""
238
+
239
+ # ------------------------------------------------------------------------------------------
240
+
241
+ try:
242
+ # SQL文件优先
243
+ if isinstance(read_sql_file, dict) and utils.isTrue(read_sql_file, dict):
244
+ read_sql_file.pop("encoding")
245
+ read_sql_file_kwargs: dict = {
246
+ "mode": "r",
247
+ "encoding": "utf-8",
248
+ **read_sql_file
249
+ }
250
+ with open(encoding="utf-8", **read_sql_file_kwargs) as _file:
251
+ sql_statement = _file.read()
252
+ else:
253
+ if not (isinstance(sql, str) and utils.check_arguments([(sql, str, "sql")])):
254
+ return None
255
+ sql_statement = sql
256
+ except Exception as e:
219
257
  logger.exception(e)
220
- return False
258
+ return None
259
+
260
+ # ------------------------------------------------------------------------------------------
261
+
262
+ if not self.connect_test():
263
+ return None
264
+
265
+ # ------------------------------------------------------------------------------------------
266
+
267
+ # 创建一个连接
268
+ with self.engine.connect() as connection:
269
+
270
+ # 开始一个事务
271
+ with connection.begin(): # 事务会自动提交或回滚
272
+
273
+ try:
274
+
275
+ # 执行 SQL 查询
276
+ result = connection.execute(text(sql_statement))
277
+
278
+ # 执行成功
279
+ logger.success(f"{info} [success]")
280
+
281
+ # 返回查询结果
282
+ if isinstance(save_to_csv, dict) and utils.isTrue(save_to_csv, dict):
283
+ save_to_csv_kwargs: dict = {
284
+ "mode": "w",
285
+ "encoding": "utf-8",
286
+ **save_to_csv
287
+ }
288
+ with open(encoding="utf-8", **save_to_csv_kwargs) as _file:
289
+ return self._result_save(_file, result)
290
+
291
+ return result
292
+
293
+ except Exception as e:
294
+ # 发生异常时回滚事务
295
+ logger.info(f"{info} [failed]")
296
+ logger.exception(e)
297
+ return None
221
298
 
222
299
  # ----------------------------------------------------------------------------------------------
223
300
 
224
- def read_data_with_pandas(self, result_type: str = "df", **kwargs) -> pd.DataFrame | dict | list | None:
225
- """读取表中所有数据"""
301
+ def read_with_pandas(
302
+ self,
303
+ method: str = "read_sql",
304
+ result_type: str = "df",
305
+ **kwargs
306
+ ) -> pd.DataFrame | list | dict:
307
+ """读取数据"""
226
308
 
227
- # 使用 pd.read_sql_table 的参数
228
- # read_data_with_pandas(result_type="df", table_name="ashare")
309
+ # 使用SQL查询数据: 使用 pd.read_sql 的参数
310
+ # read_data_with_pandas(by="sql", result_type="df", sql="SELECT * FROM table ORDER BY date DESC LIMIT 1")
229
311
 
230
- info = f"读取 {kwargs.get('table_name', None)} 表中所有数据"
312
+ # 读取表中的数据: 使用 pd.read_sql_table 的参数
313
+ # read_data_with_pandas(by="table", result_type="df", table_name="ashare")
314
+
315
+ data: pd.DataFrame = pd.DataFrame()
316
+
317
+ if not utils.check_arguments([(method, str, "method")]):
318
+ return data
319
+
320
+ if not utils.check_arguments([(result_type, str, "result_type")]):
321
+ return data
322
+
323
+ info: str = "read data"
231
324
 
232
325
  try:
233
326
 
@@ -236,28 +329,35 @@ class Database():
236
329
  # 从 kwargs 中删除 con 键
237
330
  kwargs.pop('con', None)
238
331
 
239
- # 读取数据
240
- data: pd.DataFrame = pd.read_sql_table(con=self.engine, **kwargs)
332
+ match method:
333
+ case "read_sql":
334
+ data = pd.read_sql(con=self.engine, **kwargs)
335
+ case "read_sql_query":
336
+ data = pd.read_sql_query(con=self.engine, **kwargs)
337
+ case "read_sql_table":
338
+ data = pd.read_sql_table(con=self.engine, **kwargs)
339
+ case _:
340
+ logger.error(f"{info} [incorrect method: {method}]")
341
+ return data
241
342
 
242
343
  if data.empty:
243
- logger.error(f"{info} [失败]")
244
- return None
245
-
246
- logger.success(f"{info} [成功]")
344
+ logger.error(f"{info} [failed]")
345
+ return data
247
346
 
248
- if utils.isTrue(result_type, str) and result_type == "json":
249
- return json.loads(data.to_json(orient='records'))
250
-
251
- if utils.isTrue(result_type, str) and result_type == "dict":
252
- return data.to_dict()
253
-
254
- if utils.isTrue(result_type, str) and result_type == "list":
255
- # https://stackoverflow.com/a/26716774
256
- return data.to_dict('list')
347
+ logger.success(f"{info} [success]")
257
348
 
258
- return data
349
+ match result_type:
350
+ case "json":
351
+ return json.loads(data.to_json(orient='records'))
352
+ case "dict":
353
+ return data.to_dict()
354
+ case "list":
355
+ # https://stackoverflow.com/a/26716774
356
+ return data.to_dict('list')
357
+ case _:
358
+ return data
259
359
 
260
360
  except Exception as e:
261
- logger.error(f"{info} [失败]")
361
+ logger.error(f"{info} [failed]")
262
362
  logger.exception(e)
263
- return None
363
+ return data
ezKit/http.py CHANGED
@@ -57,7 +57,7 @@ def download(
57
57
 
58
58
  except Exception as e:
59
59
 
60
- logger.error(f'{info_prefix} [failure]')
60
+ logger.error(f'{info_prefix} [failed]')
61
61
  logger.exception(e)
62
62
  return False
63
63
 
ezKit/mongo.py CHANGED
@@ -37,7 +37,7 @@ class Mongo():
37
37
  logger.success(f"{info} [success]")
38
38
  return True
39
39
  except Exception as e:
40
- logger.error(f"{info} [failure]")
40
+ logger.error(f"{info} [failed]")
41
41
  logger.exception(e)
42
42
  return False
43
43
 
@@ -65,12 +65,12 @@ class Mongo():
65
65
  # 插入多条数据
66
66
  result = db_collection.insert_many(data)
67
67
  else:
68
- logger.error(f"{info} [failure]")
68
+ logger.error(f"{info} [failed]")
69
69
  logger.error("Data type error")
70
70
  return False
71
71
  logger.success(f"{info} [success]")
72
72
  return result
73
73
  except Exception as e:
74
- logger.error(f"{info} [failure]")
74
+ logger.error(f"{info} [failed]")
75
75
  logger.exception(e)
76
76
  return False
ezKit/redis.py CHANGED
@@ -33,7 +33,7 @@ class Redis:
33
33
  logger.success(f"{info} [success]")
34
34
  return True
35
35
  except Exception as e:
36
- logger.error(f"{info} [failure]")
36
+ logger.error(f"{info} [failed]")
37
37
  logger.exception(e)
38
38
  return False
39
39
 
@@ -49,6 +49,6 @@ class Redis:
49
49
  logger.success(f"{info} [success]")
50
50
  return True
51
51
  except Exception as e:
52
- logger.error(f"{info} [failure]")
52
+ logger.error(f"{info} [failed]")
53
53
  logger.exception(e)
54
54
  return False
ezKit/utils.py CHANGED
@@ -360,16 +360,9 @@ def list_split(
360
360
  # list_split(data, 2, True) -> [[1, 2, 3, 4], [5, 6, 7, 8]] 将 data 平均分成 2个子list
361
361
  # list_split(data, 3, True) -> [[1, 2, 3], [4, 5, 6], [7, 8]] 将 data 平均分成 3个子list
362
362
 
363
- # 判断参数是否正确
364
- match True:
365
- case True if not isTrue(data, list):
366
- logger.error("argument error: data")
367
- return None
368
- case True if not isTrue(number, int):
369
- logger.error("argument error: number")
370
- return None
371
- case _:
372
- pass
363
+ # 检查参数是否正确
364
+ if not check_arguments([(data, list, "data"), (number, int, "number")]):
365
+ return None
373
366
 
374
367
  try:
375
368
 
@@ -395,19 +388,9 @@ def list_print_by_step(
395
388
  ) -> bool:
396
389
  """根据 步长 和 分隔符 有规律的打印列表中的数据"""
397
390
 
398
- # 判断参数是否正确
399
- match True:
400
- case True if not isTrue(data, list):
401
- logger.error("argument error: data")
402
- return False
403
- case True if not isTrue(step, int):
404
- logger.error("argument error: step")
405
- return False
406
- case True if not isTrue(separator, str):
407
- logger.error("argument error: separator")
408
- return False
409
- case _:
410
- pass
391
+ # 检查参数是否正确
392
+ if not check_arguments([(data, list, "data"), (step, int, "step"), (separator, str, "separator")]):
393
+ return False
411
394
 
412
395
  try:
413
396
 
@@ -1400,7 +1383,7 @@ def git_clone(
1400
1383
  return True
1401
1384
 
1402
1385
  except Exception as e:
1403
- logger.error(f'{log_prefix} [failure]')
1386
+ logger.error(f'{log_prefix} [failed]')
1404
1387
  logger.exception(e)
1405
1388
  return False
1406
1389
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ezKit
3
- Version: 1.10.5
3
+ Version: 1.10.7
4
4
  Summary: Easy Kit
5
5
  Author: septvean
6
6
  Author-email: septvean@gmail.com
@@ -0,0 +1,18 @@
1
+ ezKit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ ezKit/bottle.py,sha256=usKK1wVaZw4_D-4VwMYmOIc8jtz4TrpM30nck59HMFw,180178
3
+ ezKit/bottle_extensions.py,sha256=3reEQVZuHklXTl6r7F8kiBFFPb0RaAGc3mYJJnrMDjQ,1129
4
+ ezKit/cipher.py,sha256=0T_StbjiNI4zgrjVgcfU-ffKgu1waBA9UDudAnqFcNM,2896
5
+ ezKit/database.py,sha256=PYg3xQiCP-Vlf7WEMublAb-E8P9RmwAM7-4foHixMl4,12576
6
+ ezKit/http.py,sha256=ysXzqXFi9zmuVKINbYGwmf9Q5xDVW_DZWrSh6HSVq8M,1800
7
+ ezKit/mongo.py,sha256=l3jRMmoGrTm16OG4daSCn0JLU1nbYAmTtHokwjLXzoA,2390
8
+ ezKit/qywx.py,sha256=X_H4fzP-iEqeDEbumr7D1bXi6dxczaxfO8iyutzy02s,7171
9
+ ezKit/redis.py,sha256=tdiqfizPYQQTIUumkJGUJsJVlv0zVTSTYGQN0QutYs4,1963
10
+ ezKit/sendemail.py,sha256=tRXCsJm_RfTJ9xEWe_lTQ5kOs2JxHGPXvq0oWA7prq0,7263
11
+ ezKit/token.py,sha256=HKREyZj_T2S8-aFoFIrBXTaCKExQq4zE66OHXhGHqQg,1750
12
+ ezKit/utils.py,sha256=YE8JFePsnWYxne_a70jwr26Wc04-0sAFHk0LNOXpEJA,41906
13
+ ezKit/xftp.py,sha256=XyIdr_2rxRVLqPofG6fIYWhAMVsFwTyp46dg5P9FLW4,7774
14
+ ezKit-1.10.7.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
15
+ ezKit-1.10.7.dist-info/METADATA,sha256=3awyXKgEVsCgYopIUNxjaaNOWnV1HL8Wv1lxpucS2bY,191
16
+ ezKit-1.10.7.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
17
+ ezKit-1.10.7.dist-info/top_level.txt,sha256=aYLB_1WODsqNTsTFWcKP-BN0KCTKcV-HZJ4zlHkCFw8,6
18
+ ezKit-1.10.7.dist-info/RECORD,,
@@ -1,18 +0,0 @@
1
- ezKit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- ezKit/bottle.py,sha256=usKK1wVaZw4_D-4VwMYmOIc8jtz4TrpM30nck59HMFw,180178
3
- ezKit/bottle_extensions.py,sha256=3reEQVZuHklXTl6r7F8kiBFFPb0RaAGc3mYJJnrMDjQ,1129
4
- ezKit/cipher.py,sha256=0T_StbjiNI4zgrjVgcfU-ffKgu1waBA9UDudAnqFcNM,2896
5
- ezKit/database.py,sha256=b_4gR_bvyC3IhP6TbmeKdVrif1DNG_NqO3YIyy-XqQE,8891
6
- ezKit/http.py,sha256=i3Kn5AMAMicDMcDjxKKZU7zqEKTU88Ec9_LwCuBJy-0,1801
7
- ezKit/mongo.py,sha256=dOm_1wXEPp_e8Ml5Qq78M7FDNrQUAZaThzVIiiLJJwk,2393
8
- ezKit/qywx.py,sha256=X_H4fzP-iEqeDEbumr7D1bXi6dxczaxfO8iyutzy02s,7171
9
- ezKit/redis.py,sha256=g2_V4jvq0djRc20jLZkgeAeF_bYrq-Rbl_kHcCUPZcA,1965
10
- ezKit/sendemail.py,sha256=tRXCsJm_RfTJ9xEWe_lTQ5kOs2JxHGPXvq0oWA7prq0,7263
11
- ezKit/token.py,sha256=HKREyZj_T2S8-aFoFIrBXTaCKExQq4zE66OHXhGHqQg,1750
12
- ezKit/utils.py,sha256=ILLaptYUSalERbCOhmoq4w0ZNZgj9yurpHEZwjRMZ8w,42387
13
- ezKit/xftp.py,sha256=XyIdr_2rxRVLqPofG6fIYWhAMVsFwTyp46dg5P9FLW4,7774
14
- ezKit-1.10.5.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
15
- ezKit-1.10.5.dist-info/METADATA,sha256=onqUqJ4_5WVpBoLpSOis-Z6uYbmM3GCMPPrAfTvi_yw,191
16
- ezKit-1.10.5.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
17
- ezKit-1.10.5.dist-info/top_level.txt,sha256=aYLB_1WODsqNTsTFWcKP-BN0KCTKcV-HZJ4zlHkCFw8,6
18
- ezKit-1.10.5.dist-info/RECORD,,
File without changes