mdbq 4.0.76__py3-none-any.whl → 4.0.78__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.
- mdbq/__version__.py +1 -1
- mdbq/log/mylogger.py +29 -1
- mdbq/mysql/uploader.py +9 -17
- {mdbq-4.0.76.dist-info → mdbq-4.0.78.dist-info}/METADATA +2 -2
- {mdbq-4.0.76.dist-info → mdbq-4.0.78.dist-info}/RECORD +7 -7
- {mdbq-4.0.76.dist-info → mdbq-4.0.78.dist-info}/WHEEL +1 -1
- {mdbq-4.0.76.dist-info → mdbq-4.0.78.dist-info}/top_level.txt +0 -0
mdbq/__version__.py
CHANGED
@@ -1 +1 @@
|
|
1
|
-
VERSION = '4.0.
|
1
|
+
VERSION = '4.0.78'
|
mdbq/log/mylogger.py
CHANGED
@@ -200,6 +200,17 @@ class MyLogger:
|
|
200
200
|
if not extra_data and hasattr(record, 'extra'):
|
201
201
|
extra_data = getattr(record, 'extra', None)
|
202
202
|
if extra_data:
|
203
|
+
# 优先显示func信息
|
204
|
+
func_name = extra_data.get('func', '')
|
205
|
+
module_name = extra_data.get('model', '')
|
206
|
+
line_number = extra_data.get('lines', '')
|
207
|
+
if func_name:
|
208
|
+
msg += f" | Function: {func_name}"
|
209
|
+
if module_name:
|
210
|
+
msg += f" | Module: {module_name}"
|
211
|
+
if line_number:
|
212
|
+
msg += f" | Line: {line_number}"
|
213
|
+
|
203
214
|
context_data = extra_data.get('context_data', {})
|
204
215
|
if context_data:
|
205
216
|
msg += f" | Context: {context_data}"
|
@@ -207,7 +218,7 @@ class MyLogger:
|
|
207
218
|
if metrics:
|
208
219
|
msg += f" | Metrics: {metrics}"
|
209
220
|
extra = {k: v for k, v in extra_data.items()
|
210
|
-
if k not in ('context_data', '性能指标')}
|
221
|
+
if k not in ('context_data', '性能指标', 'func', 'model', 'lines')}
|
211
222
|
if extra:
|
212
223
|
msg += f" | Extra: {extra}"
|
213
224
|
return msg
|
@@ -413,6 +424,23 @@ class MyLogger:
|
|
413
424
|
if extra:
|
414
425
|
log_extra.update(extra)
|
415
426
|
|
427
|
+
# 获取当前调用func
|
428
|
+
try:
|
429
|
+
frame = inspect.currentframe()
|
430
|
+
# 跳过logger内部函数,找到真正的调用者
|
431
|
+
caller_frame = frame.f_back
|
432
|
+
skip_functions = ['_sync_log', 'log', 'debug', 'info', 'warning', 'error', 'critical', 'wrapper', 'log_error_handler', 'decorator']
|
433
|
+
while caller_frame and caller_frame.f_code.co_name in skip_functions:
|
434
|
+
caller_frame = caller_frame.f_back
|
435
|
+
if caller_frame:
|
436
|
+
log_extra['func'] = caller_frame.f_code.co_name
|
437
|
+
log_extra['model'] = caller_frame.f_globals.get('__name__', '')
|
438
|
+
log_extra['lines'] = caller_frame.f_lineno
|
439
|
+
del frame
|
440
|
+
except Exception:
|
441
|
+
# 如果获取函数信息失败,不影响正常日志记录
|
442
|
+
pass
|
443
|
+
|
416
444
|
# 添加上下文信息
|
417
445
|
if hasattr(self._context, 'data') and self._context.data:
|
418
446
|
log_extra['context_data'] = self._context.data.copy()
|
mdbq/mysql/uploader.py
CHANGED
@@ -11,7 +11,6 @@ from mdbq.log import mylogger
|
|
11
11
|
from mdbq.myconf import myconf
|
12
12
|
from typing import Union, List, Dict, Optional, Any, Tuple, Set
|
13
13
|
from dbutils.pooled_db import PooledDB
|
14
|
-
import sys
|
15
14
|
from decimal import Decimal, InvalidOperation
|
16
15
|
import math
|
17
16
|
import json
|
@@ -986,7 +985,6 @@ class MySQLUploader:
|
|
986
985
|
logger.error('数据表不存在', {
|
987
986
|
'库': db_name,
|
988
987
|
'表': table_name,
|
989
|
-
'func': sys._getframe().f_code.co_name,
|
990
988
|
})
|
991
989
|
raise ValueError(f"数据表不存在: `{db_name}`.`{table_name}`")
|
992
990
|
if table_existed and unique_keys:
|
@@ -1019,7 +1017,6 @@ class MySQLUploader:
|
|
1019
1017
|
'库': db_name,
|
1020
1018
|
'表': table_name,
|
1021
1019
|
'列': self._shorten_for_log(table_columns),
|
1022
|
-
'func': sys._getframe().f_code.co_name,
|
1023
1020
|
})
|
1024
1021
|
raise ValueError(f"获取列失败 `{db_name}`.`{table_name}`")
|
1025
1022
|
for col in set_typ:
|
@@ -1028,7 +1025,6 @@ class MySQLUploader:
|
|
1028
1025
|
'库': db_name,
|
1029
1026
|
'表': table_name,
|
1030
1027
|
'列': col,
|
1031
|
-
'func': sys._getframe().f_code.co_name,
|
1032
1028
|
})
|
1033
1029
|
raise ValueError(f"列不存在: `{col}` -> `{db_name}`.`{table_name}`")
|
1034
1030
|
if date_column and date_column in table_columns:
|
@@ -1151,7 +1147,6 @@ class MySQLUploader:
|
|
1151
1147
|
logger.error('数据转字典时发生错误', {
|
1152
1148
|
'error': str(e),
|
1153
1149
|
'data': self._shorten_for_log(data),
|
1154
|
-
'func': sys._getframe().f_code.co_name,
|
1155
1150
|
})
|
1156
1151
|
raise ValueError(f"数据转字典时发生错误: {e}")
|
1157
1152
|
elif isinstance(data, dict):
|
@@ -1167,7 +1162,6 @@ class MySQLUploader:
|
|
1167
1162
|
else:
|
1168
1163
|
logger.error('数据结构必须是字典、列表、字典列表或dataframe', {
|
1169
1164
|
'data': self._shorten_for_log(data),
|
1170
|
-
'func': sys._getframe().f_code.co_name,
|
1171
1165
|
})
|
1172
1166
|
raise ValueError("数据结构必须是字典、列表、字典列表或dataframe")
|
1173
1167
|
|
@@ -1175,9 +1169,7 @@ class MySQLUploader:
|
|
1175
1169
|
data = self.normalize_column_names(data)
|
1176
1170
|
|
1177
1171
|
if not set_typ:
|
1178
|
-
logger.warning('set_typ为空, 将自动推断数据类型, 可能存在数据类型识别错误'
|
1179
|
-
'func': sys._getframe().f_code.co_name,
|
1180
|
-
})
|
1172
|
+
logger.warning('set_typ为空, 将自动推断数据类型, 可能存在数据类型识别错误')
|
1181
1173
|
# set_typ的键清洗
|
1182
1174
|
if not set_typ:
|
1183
1175
|
set_typ = {}
|
@@ -1227,7 +1219,6 @@ class MySQLUploader:
|
|
1227
1219
|
'行': row_idx,
|
1228
1220
|
'报错': str(e),
|
1229
1221
|
'row': self._shorten_for_log(row),
|
1230
|
-
'func': sys._getframe().f_code.co_name,
|
1231
1222
|
})
|
1232
1223
|
raise ValueError(f"行:{row_idx}, 列:`{col_name}`-> 报错: {str(e)}")
|
1233
1224
|
prepared_data.append(prepared_row)
|
@@ -1318,6 +1309,14 @@ class MySQLUploader:
|
|
1318
1309
|
- 如需"跳过"行为,设置 update_on_duplicate=False 即可。
|
1319
1310
|
"""
|
1320
1311
|
# upload_start = time.time()
|
1312
|
+
# 检查data参数是否为None
|
1313
|
+
if data is None:
|
1314
|
+
logger.error('data参数不能为None', {
|
1315
|
+
'库': db_name,
|
1316
|
+
'表': table_name,
|
1317
|
+
})
|
1318
|
+
raise ValueError("data参数不能为None,请传入有效的数据")
|
1319
|
+
|
1321
1320
|
if isinstance(data, list) or (hasattr(data, 'shape') and hasattr(data, '__len__')):
|
1322
1321
|
initial_row_count = len(data)
|
1323
1322
|
else:
|
@@ -1374,7 +1373,6 @@ class MySQLUploader:
|
|
1374
1373
|
'表': table_name,
|
1375
1374
|
'批次': batch_id,
|
1376
1375
|
'分表方式': partition_by,
|
1377
|
-
'func': sys._getframe().f_code.co_name,
|
1378
1376
|
})
|
1379
1377
|
raise ValueError("分表方式必须是 'year' 或 'month' 或 'None'")
|
1380
1378
|
|
@@ -1388,7 +1386,6 @@ class MySQLUploader:
|
|
1388
1386
|
else:
|
1389
1387
|
logger.error('数据库不存在', {
|
1390
1388
|
'库': db_name,
|
1391
|
-
'func': sys._getframe().f_code.co_name,
|
1392
1389
|
})
|
1393
1390
|
raise ValueError(f"数据库不存在: `{db_name}`")
|
1394
1391
|
|
@@ -1404,7 +1401,6 @@ class MySQLUploader:
|
|
1404
1401
|
'批次': batch_id,
|
1405
1402
|
'缺失列': partition_date_column,
|
1406
1403
|
'row': self._shorten_for_log(row),
|
1407
|
-
'func': sys._getframe().f_code.co_name,
|
1408
1404
|
})
|
1409
1405
|
dropped_rows += 1
|
1410
1406
|
continue
|
@@ -1422,7 +1418,6 @@ class MySQLUploader:
|
|
1422
1418
|
'表': table_name,
|
1423
1419
|
'row_data': self._shorten_for_log(row),
|
1424
1420
|
'error': str(e),
|
1425
|
-
'func': sys._getframe().f_code.co_name,
|
1426
1421
|
})
|
1427
1422
|
dropped_rows += 1
|
1428
1423
|
continue
|
@@ -1455,7 +1450,6 @@ class MySQLUploader:
|
|
1455
1450
|
'分表': part_table,
|
1456
1451
|
'error': str(e),
|
1457
1452
|
'数据样例': self._shorten_for_log(part_data, 2),
|
1458
|
-
'func': sys._getframe().f_code.co_name,
|
1459
1453
|
})
|
1460
1454
|
continue # 跳过当前分表,继续处理其他分表
|
1461
1455
|
else:
|
@@ -1485,7 +1479,6 @@ class MySQLUploader:
|
|
1485
1479
|
'error': str(e),
|
1486
1480
|
'error_type': type(e).__name__,
|
1487
1481
|
'数据样例': self._shorten_for_log(data, 2),
|
1488
|
-
'func': sys._getframe().f_code.co_name,
|
1489
1482
|
})
|
1490
1483
|
return False
|
1491
1484
|
finally:
|
@@ -1574,7 +1567,6 @@ class MySQLUploader:
|
|
1574
1567
|
'错误值': mode,
|
1575
1568
|
'可选值': valid_modes,
|
1576
1569
|
'自动使用默认模式': 'batch',
|
1577
|
-
'func': sys._getframe().f_code.co_name,
|
1578
1570
|
})
|
1579
1571
|
return 'batch'
|
1580
1572
|
return mode.lower()
|
@@ -1,7 +1,7 @@
|
|
1
1
|
mdbq/__init__.py,sha256=Il5Q9ATdX8yXqVxtP_nYqUhExzxPC_qk_WXQ_4h0exg,16
|
2
|
-
mdbq/__version__.py,sha256=
|
2
|
+
mdbq/__version__.py,sha256=3AA2p5c6tOTM_2v5e5EAeYlqso5Y1D5shirSVp5akUM,18
|
3
3
|
mdbq/log/__init__.py,sha256=Mpbrav0s0ifLL7lVDAuePEi1hJKiSHhxcv1byBKDl5E,15
|
4
|
-
mdbq/log/mylogger.py,sha256=
|
4
|
+
mdbq/log/mylogger.py,sha256=DyBftCMNLe1pTTXsa830pUtDISJxpJHFIradYtE3lFA,26418
|
5
5
|
mdbq/myconf/__init__.py,sha256=jso1oHcy6cJEfa7udS_9uO5X6kZLoPBF8l3wCYmr5dM,18
|
6
6
|
mdbq/myconf/myconf.py,sha256=rHvQCnQRKhQ49AZBke-Z4v28hyOLmHt4MylIuB0H6yA,33516
|
7
7
|
mdbq/mysql/__init__.py,sha256=A_DPJyAoEvTSFojiI2e94zP0FKtCkkwKP1kYUCSyQzo,11
|
@@ -9,7 +9,7 @@ mdbq/mysql/deduplicator.py,sha256=AB3gL7ZwhcmzGHSu4UY4M6YZVPFZ2wlAN3BCcwAhegQ,73
|
|
9
9
|
mdbq/mysql/mysql.py,sha256=pDg771xBugCMSTWeskIFTi3pFLgaqgyG3smzf-86Wn8,56772
|
10
10
|
mdbq/mysql/s_query.py,sha256=nwhyqbxq-V0sGUJbdjiUDEwjpDxiKrzG0PjV6wkrWU4,50474
|
11
11
|
mdbq/mysql/unique_.py,sha256=MaztT-WIyEQUs-OOYY4pFulgHVcXR1BfCy3QUz0XM_U,21127
|
12
|
-
mdbq/mysql/uploader.py,sha256=
|
12
|
+
mdbq/mysql/uploader.py,sha256=xodmN3f5pT1T2yJu01ckgYb_THE__rm81kgNJfqtinc,111530
|
13
13
|
mdbq/other/__init__.py,sha256=jso1oHcy6cJEfa7udS_9uO5X6kZLoPBF8l3wCYmr5dM,18
|
14
14
|
mdbq/other/download_sku_picture.py,sha256=X66sVdvVgzoNzmgVJyPtd7bjEvctEKtLPblEPF65EWc,46940
|
15
15
|
mdbq/other/error_handler.py,sha256=4p5haAXSY-P78stp4Xwo_MwAngWYqyKj5ogWIuYXMeY,12631
|
@@ -24,7 +24,7 @@ mdbq/redis/getredis.py,sha256=vpBuNc22uj9Vr-_Dh25_wpwWM1e-072EAAIBdB_IpL0,23494
|
|
24
24
|
mdbq/selenium/__init__.py,sha256=AKzeEceqZyvqn2dEDoJSzDQnbuENkJSHAlbHAD0u0ZI,10
|
25
25
|
mdbq/selenium/get_driver.py,sha256=sJYMfkzNprGoHYkppVqxglRSIQm6mO7wvgYvSzTWHdc,20903
|
26
26
|
mdbq/spider/__init__.py,sha256=RBMFXGy_jd1HXZhngB2T2XTvJqki8P_Fr-pBcwijnew,18
|
27
|
-
mdbq-4.0.
|
28
|
-
mdbq-4.0.
|
29
|
-
mdbq-4.0.
|
30
|
-
mdbq-4.0.
|
27
|
+
mdbq-4.0.78.dist-info/METADATA,sha256=rNd9aQqkIiblLo105u3YNQ9J4FP7efHqNapi4ku8lZ8,364
|
28
|
+
mdbq-4.0.78.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
|
29
|
+
mdbq-4.0.78.dist-info/top_level.txt,sha256=2FQ-uLnCSB-OwFiWntzmwosW3X2Xqsg0ewh1axsaylA,5
|
30
|
+
mdbq-4.0.78.dist-info/RECORD,,
|
File without changes
|