ezKit 1.10.5__py3-none-any.whl → 1.10.6__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
@@ -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} [failure]")
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} [failure]")
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} [failure]")
215
+ # logger.error(f"{info} [failure]")
216
+ # return False
215
217
 
216
- except Exception as e:
218
+ # except Exception as e:
217
219
 
218
- logger.error(f'{info} [failure]')
220
+ # logger.error(f'{info} [failure]')
221
+ # logger.exception(e)
222
+ # return False
223
+
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
+ """读取数据"""
308
+
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")
311
+
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()
226
316
 
227
- # 使用 pd.read_sql_table 的参数
228
- # read_data_with_pandas(result_type="df", table_name="ashare")
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
229
322
 
230
- info = f"读取 {kwargs.get('table_name', None)} 表中所有数据"
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
344
+ logger.error(f"{info} [failed]")
345
+ return data
245
346
 
246
- logger.success(f"{info} [成功]")
247
-
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()
347
+ logger.success(f"{info} [success]")
253
348
 
254
- if utils.isTrue(result_type, str) and result_type == "list":
255
- # https://stackoverflow.com/a/26716774
256
- return data.to_dict('list')
257
-
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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ezKit
3
- Version: 1.10.5
3
+ Version: 1.10.6
4
4
  Summary: Easy Kit
5
5
  Author: septvean
6
6
  Author-email: septvean@gmail.com
@@ -2,7 +2,7 @@ ezKit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
2
  ezKit/bottle.py,sha256=usKK1wVaZw4_D-4VwMYmOIc8jtz4TrpM30nck59HMFw,180178
3
3
  ezKit/bottle_extensions.py,sha256=3reEQVZuHklXTl6r7F8kiBFFPb0RaAGc3mYJJnrMDjQ,1129
4
4
  ezKit/cipher.py,sha256=0T_StbjiNI4zgrjVgcfU-ffKgu1waBA9UDudAnqFcNM,2896
5
- ezKit/database.py,sha256=b_4gR_bvyC3IhP6TbmeKdVrif1DNG_NqO3YIyy-XqQE,8891
5
+ ezKit/database.py,sha256=Hc1XWWnBwrnnaV8vOH9DAvZXz1DaEVEXSwKfWakX89I,12584
6
6
  ezKit/http.py,sha256=i3Kn5AMAMicDMcDjxKKZU7zqEKTU88Ec9_LwCuBJy-0,1801
7
7
  ezKit/mongo.py,sha256=dOm_1wXEPp_e8Ml5Qq78M7FDNrQUAZaThzVIiiLJJwk,2393
8
8
  ezKit/qywx.py,sha256=X_H4fzP-iEqeDEbumr7D1bXi6dxczaxfO8iyutzy02s,7171
@@ -11,8 +11,8 @@ ezKit/sendemail.py,sha256=tRXCsJm_RfTJ9xEWe_lTQ5kOs2JxHGPXvq0oWA7prq0,7263
11
11
  ezKit/token.py,sha256=HKREyZj_T2S8-aFoFIrBXTaCKExQq4zE66OHXhGHqQg,1750
12
12
  ezKit/utils.py,sha256=ILLaptYUSalERbCOhmoq4w0ZNZgj9yurpHEZwjRMZ8w,42387
13
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,,
14
+ ezKit-1.10.6.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
15
+ ezKit-1.10.6.dist-info/METADATA,sha256=M7MZnhU7VDU0Zx7TG8Lrn_t_IS0E46zcyzVUS3EDRuc,191
16
+ ezKit-1.10.6.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
17
+ ezKit-1.10.6.dist-info/top_level.txt,sha256=aYLB_1WODsqNTsTFWcKP-BN0KCTKcV-HZJ4zlHkCFw8,6
18
+ ezKit-1.10.6.dist-info/RECORD,,
File without changes