mdbq 3.10.4__py3-none-any.whl → 3.10.6__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/mysql/uploader.py +27 -25
- {mdbq-3.10.4.dist-info → mdbq-3.10.6.dist-info}/METADATA +1 -1
- {mdbq-3.10.4.dist-info → mdbq-3.10.6.dist-info}/RECORD +6 -6
- {mdbq-3.10.4.dist-info → mdbq-3.10.6.dist-info}/WHEEL +0 -0
- {mdbq-3.10.4.dist-info → mdbq-3.10.6.dist-info}/top_level.txt +0 -0
mdbq/__version__.py
CHANGED
@@ -1 +1 @@
|
|
1
|
-
VERSION = '3.10.
|
1
|
+
VERSION = '3.10.6'
|
mdbq/mysql/uploader.py
CHANGED
@@ -925,7 +925,6 @@ class MySQLUploader:
|
|
925
925
|
raise ValueError(f"行:{row_idx}, 列:`{col_name}`-> 报错: {str(e)}")
|
926
926
|
prepared_data.append(prepared_row)
|
927
927
|
|
928
|
-
logger.debug(f"已准备 {len(prepared_data)} 行数据")
|
929
928
|
return prepared_data, filtered_set_typ
|
930
929
|
|
931
930
|
def upload_data(
|
@@ -961,7 +960,7 @@ class MySQLUploader:
|
|
961
960
|
:param auto_create: 表不存在时是否自动创建,默认为True
|
962
961
|
:param indexes: 需要创建索引的列列表,可选
|
963
962
|
:param update_on_duplicate: 遇到重复数据时是否更新旧数据(默认为False)
|
964
|
-
:param transaction_mode:
|
963
|
+
:param transaction_mode: 事务模式,可选值:
|
965
964
|
- 'row' : 逐行提交事务(错误隔离性好)
|
966
965
|
- 'batch' : 整批提交事务(性能最优)
|
967
966
|
- 'hybrid' : 混合模式(每N行提交,平衡性能与安全性)
|
@@ -981,14 +980,11 @@ class MySQLUploader:
|
|
981
980
|
'分表方式': partition_by,
|
982
981
|
'排重': check_duplicate,
|
983
982
|
'传入': len(data) if hasattr(data, '__len__') else 1,
|
984
|
-
'自动建表': auto_create
|
983
|
+
# '自动建表': auto_create
|
985
984
|
})
|
986
985
|
|
987
986
|
try:
|
988
987
|
# 验证参数
|
989
|
-
if not set_typ:
|
990
|
-
logger.debug(f'set_typ 参数缺失,建表不指定数据类型字典,后续存储数据容易引发异常')
|
991
|
-
|
992
988
|
if partition_by:
|
993
989
|
partition_by = str(partition_by).lower()
|
994
990
|
if partition_by not in ['year', 'month']:
|
@@ -1084,7 +1080,7 @@ class MySQLUploader:
|
|
1084
1080
|
'库': db_name,
|
1085
1081
|
'表': table_name,
|
1086
1082
|
'批次': batch_id,
|
1087
|
-
'
|
1083
|
+
'finish': success_flag,
|
1088
1084
|
# '耗时': round(time.time() - upload_start, 2),
|
1089
1085
|
'数据行': initial_row_count
|
1090
1086
|
})
|
@@ -1114,7 +1110,7 @@ class MySQLUploader:
|
|
1114
1110
|
:param batch_size: 批量插入大小,默认为1000
|
1115
1111
|
:param update_on_duplicate: 遇到重复数据时是否更新旧数据(默认为False)
|
1116
1112
|
:param batch_id: 批次ID用于日志追踪,可选
|
1117
|
-
:param transaction_mode:
|
1113
|
+
:param transaction_mode: 事务模式,可选值:
|
1118
1114
|
- 'row' : 逐行提交事务(错误隔离性好)
|
1119
1115
|
- 'batch' : 整批提交事务(性能最优)
|
1120
1116
|
- 'hybrid' : 混合模式(每N行提交,平衡性能与安全性)
|
@@ -1143,11 +1139,11 @@ class MySQLUploader:
|
|
1143
1139
|
logger.info('插入完成', {
|
1144
1140
|
'库': db_name,
|
1145
1141
|
'表': table_name,
|
1146
|
-
'
|
1142
|
+
'总计': len(data),
|
1147
1143
|
'插入': total_inserted,
|
1148
1144
|
'跳过': total_skipped,
|
1149
1145
|
'失败': total_failed,
|
1150
|
-
'
|
1146
|
+
'事务模式': transaction_mode,
|
1151
1147
|
})
|
1152
1148
|
|
1153
1149
|
def _validate_transaction_mode(self, mode: str) -> str:
|
@@ -1223,6 +1219,25 @@ class MySQLUploader:
|
|
1223
1219
|
"""
|
1224
1220
|
return sql
|
1225
1221
|
|
1222
|
+
def _get_decimal_scale(self, decimal_type: str) -> int:
|
1223
|
+
"""
|
1224
|
+
从DECIMAL类型定义中提取小数位数
|
1225
|
+
|
1226
|
+
:param decimal_type: DECIMAL类型字符串,如'DECIMAL(10,4)'
|
1227
|
+
:return: 小数位数
|
1228
|
+
:raises: 无显式抛出异常,但解析失败时返回默认值2
|
1229
|
+
"""
|
1230
|
+
try:
|
1231
|
+
# 匹配DECIMAL类型中的精度和小数位数
|
1232
|
+
match = re.match(r'decimal\((\d+),\s*(\d+)\)', decimal_type.lower())
|
1233
|
+
if match:
|
1234
|
+
return int(match.group(2))
|
1235
|
+
except (ValueError, AttributeError, IndexError):
|
1236
|
+
pass
|
1237
|
+
|
1238
|
+
# 默认返回2位小数
|
1239
|
+
return 2
|
1240
|
+
|
1226
1241
|
def _prepare_insert_sql(
|
1227
1242
|
self,
|
1228
1243
|
db_name: str,
|
@@ -1345,7 +1360,7 @@ class MySQLUploader:
|
|
1345
1360
|
'批次': f'{batch_id} {batch_index + 1}/{total_data_length}',
|
1346
1361
|
'error_type': type(e).__name__,
|
1347
1362
|
'批量操作失败': str(e),
|
1348
|
-
'
|
1363
|
+
'事务模式': transaction_mode,
|
1349
1364
|
'处理方式': '整个批次回滚'
|
1350
1365
|
})
|
1351
1366
|
|
@@ -1382,26 +1397,13 @@ class MySQLUploader:
|
|
1382
1397
|
'数据类型': set_typ,
|
1383
1398
|
'是否排重': check_duplicate,
|
1384
1399
|
'排重列': duplicate_columns,
|
1385
|
-
'
|
1400
|
+
'事务模式': transaction_mode,
|
1386
1401
|
})
|
1387
1402
|
|
1388
1403
|
# 混合模式最后统一提交
|
1389
1404
|
if transaction_mode == 'hybrid':
|
1390
1405
|
conn.commit()
|
1391
1406
|
|
1392
|
-
logger.debug(sys._getframe().f_code.co_name, {
|
1393
|
-
'库': db_name,
|
1394
|
-
'表': table_name,
|
1395
|
-
'批次': batch_id,
|
1396
|
-
'批次处理完成': batch_index // len(batch) + 1,
|
1397
|
-
'总批次': (total_data_length + len(batch) - 1) // len(batch),
|
1398
|
-
'数据量': len(batch),
|
1399
|
-
'插入': batch_inserted,
|
1400
|
-
'跳过': batch_skipped,
|
1401
|
-
'失败': batch_failed,
|
1402
|
-
'事务提交模式': transaction_mode,
|
1403
|
-
})
|
1404
|
-
|
1405
1407
|
return batch_inserted, batch_skipped, batch_failed
|
1406
1408
|
|
1407
1409
|
def _process_single_row(
|
@@ -1,5 +1,5 @@
|
|
1
1
|
mdbq/__init__.py,sha256=Il5Q9ATdX8yXqVxtP_nYqUhExzxPC_qk_WXQ_4h0exg,16
|
2
|
-
mdbq/__version__.py,sha256=
|
2
|
+
mdbq/__version__.py,sha256=2yGCmv-ga4rvoQTusuYVliB1aOSRt0PA120jDEeMuUg,18
|
3
3
|
mdbq/aggregation/__init__.py,sha256=EeDqX2Aml6SPx8363J-v1lz0EcZtgwIBYyCJV6CcEDU,40
|
4
4
|
mdbq/aggregation/optimize.py,sha256=2oalzD9weZhDclUC22OLxYa8Zj7KnmsGUoUau_Jlyc4,19796
|
5
5
|
mdbq/aggregation/query_data.py,sha256=5_OzjGR5Sq00q-EgAYmSE5V9i4Solw9y4hkldl4mvt8,179808
|
@@ -12,7 +12,7 @@ mdbq/mysql/__init__.py,sha256=A_DPJyAoEvTSFojiI2e94zP0FKtCkkwKP1kYUCSyQzo,11
|
|
12
12
|
mdbq/mysql/deduplicator.py,sha256=brhX3eyE8-kn3nAYweKfBbAkXiNcyw_pL4CTyPqmPBg,21983
|
13
13
|
mdbq/mysql/mysql.py,sha256=Fzaqbjg5g3HdNl50jInIrdurdzcgR2CCzdKLVImD1-Q,55339
|
14
14
|
mdbq/mysql/s_query.py,sha256=X055aLRAgxVvueXx4NbfNjp6MyBI02_XBb1pTKw09L0,8660
|
15
|
-
mdbq/mysql/uploader.py,sha256=
|
15
|
+
mdbq/mysql/uploader.py,sha256=nqTSa6Pw0SUdioQE-wTHXVPirMsmOJE_Hy4A0N1g3E0,61857
|
16
16
|
mdbq/other/__init__.py,sha256=jso1oHcy6cJEfa7udS_9uO5X6kZLoPBF8l3wCYmr5dM,18
|
17
17
|
mdbq/other/download_sku_picture.py,sha256=YU8DxKMXbdeE1OOKEA848WVp62jYHw5O4tXTjUdq9H0,44832
|
18
18
|
mdbq/other/otk.py,sha256=iclBIFbQbhlqzUbcMMoePXBpcP1eZ06ZtjnhcA_EbmE,7241
|
@@ -25,7 +25,7 @@ mdbq/redis/__init__.py,sha256=YtgBlVSMDphtpwYX248wGge1x-Ex_mMufz4-8W0XRmA,12
|
|
25
25
|
mdbq/redis/getredis.py,sha256=Uk8-cOWT0JU1qRyIVqdbYokSLvkDIAfcokmYj1ebw8k,24104
|
26
26
|
mdbq/spider/__init__.py,sha256=RBMFXGy_jd1HXZhngB2T2XTvJqki8P_Fr-pBcwijnew,18
|
27
27
|
mdbq/spider/aikucun.py,sha256=YyPWa_nOH1zs8wgTDcgzn5w8szGKWPyWzmWMVIPkFnU,21638
|
28
|
-
mdbq-3.10.
|
29
|
-
mdbq-3.10.
|
30
|
-
mdbq-3.10.
|
31
|
-
mdbq-3.10.
|
28
|
+
mdbq-3.10.6.dist-info/METADATA,sha256=_mnvUCQWy7MDVQS-VdYcY0S-n5PqymcyoqCqraB9DMs,364
|
29
|
+
mdbq-3.10.6.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
|
30
|
+
mdbq-3.10.6.dist-info/top_level.txt,sha256=2FQ-uLnCSB-OwFiWntzmwosW3X2Xqsg0ewh1axsaylA,5
|
31
|
+
mdbq-3.10.6.dist-info/RECORD,,
|
File without changes
|
File without changes
|