mdbq 4.0.57__py3-none-any.whl → 4.0.59__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 +86 -9
- {mdbq-4.0.57.dist-info → mdbq-4.0.59.dist-info}/METADATA +1 -1
- {mdbq-4.0.57.dist-info → mdbq-4.0.59.dist-info}/RECORD +6 -6
- {mdbq-4.0.57.dist-info → mdbq-4.0.59.dist-info}/WHEEL +0 -0
- {mdbq-4.0.57.dist-info → mdbq-4.0.59.dist-info}/top_level.txt +0 -0
mdbq/__version__.py
CHANGED
@@ -1 +1 @@
|
|
1
|
-
VERSION = '4.0.
|
1
|
+
VERSION = '4.0.59'
|
mdbq/mysql/uploader.py
CHANGED
@@ -341,9 +341,17 @@ class MySQLUploader:
|
|
341
341
|
# 始终做特殊字符清理
|
342
342
|
cleaned = re.sub(r'[^\w\u4e00-\u9fff$]', '_', identifier)
|
343
343
|
cleaned = re.sub(r'_+', '_', cleaned).strip('_')
|
344
|
+
# 如果清理后为空字符串,使用默认标识符
|
344
345
|
if not cleaned:
|
345
|
-
logger.
|
346
|
-
|
346
|
+
logger.warning('标识符清理后为空,使用默认标识符', {'原始标识符': identifier})
|
347
|
+
# 使用原始标识符的哈希值作为后缀,保持可追溯性
|
348
|
+
import hashlib
|
349
|
+
hash_suffix = hashlib.md5(identifier.encode('utf-8')).hexdigest()[:8]
|
350
|
+
cleaned = f'unknown_col_{hash_suffix}'
|
351
|
+
|
352
|
+
# 确保标识符不以数字开头(MySQL要求)
|
353
|
+
if cleaned and cleaned[0].isdigit():
|
354
|
+
cleaned = f'col_{cleaned}'
|
347
355
|
mysql_keywords = {
|
348
356
|
'select', 'insert', 'update', 'delete', 'from', 'where', 'and', 'or',
|
349
357
|
'not', 'like', 'in', 'is', 'null', 'true', 'false', 'between'
|
@@ -448,9 +456,33 @@ class MySQLUploader:
|
|
448
456
|
|
449
457
|
# 处理主键
|
450
458
|
if primary_keys and len(primary_keys) > 0:
|
451
|
-
#
|
452
|
-
|
453
|
-
|
459
|
+
# 验证主键列是否存在于set_typ中
|
460
|
+
valid_primary_keys = []
|
461
|
+
for pk in primary_keys:
|
462
|
+
normalized_pk = self._normalize_col(pk)
|
463
|
+
if normalized_pk in set_typ:
|
464
|
+
valid_primary_keys.append(pk)
|
465
|
+
else:
|
466
|
+
logger.warning('主键列不存在于表结构中,跳过', {
|
467
|
+
'库': db_name,
|
468
|
+
'表': table_name,
|
469
|
+
'列': pk,
|
470
|
+
'规范化后': normalized_pk,
|
471
|
+
'可用列': list(set_typ.keys())
|
472
|
+
})
|
473
|
+
|
474
|
+
if valid_primary_keys:
|
475
|
+
# 如果指定了主键,直接使用指定的主键
|
476
|
+
safe_primary_keys = [_index_col_sql(pk) for pk in valid_primary_keys]
|
477
|
+
primary_key_sql = f"PRIMARY KEY ({','.join(safe_primary_keys)})"
|
478
|
+
else:
|
479
|
+
# 如果没有有效的主键,使用id作为主键
|
480
|
+
logger.warning('所有主键列都不存在于表结构中,使用默认id主键', {
|
481
|
+
'库': db_name,
|
482
|
+
'表': table_name,
|
483
|
+
'原始主键': primary_keys
|
484
|
+
})
|
485
|
+
primary_key_sql = f"PRIMARY KEY (`id`)"
|
454
486
|
else:
|
455
487
|
# 如果没有指定主键,使用id作为主键
|
456
488
|
primary_key_sql = f"PRIMARY KEY (`id`)"
|
@@ -462,9 +494,18 @@ class MySQLUploader:
|
|
462
494
|
index_defs.append(f"INDEX `idx_{self._normalize_col(date_column)}` ({safe_date_col})")
|
463
495
|
if indexes:
|
464
496
|
for idx_col in indexes:
|
465
|
-
|
497
|
+
normalized_idx_col = self._normalize_col(idx_col)
|
498
|
+
if normalized_idx_col in set_typ:
|
466
499
|
safe_idx_col = _index_col_sql(idx_col)
|
467
|
-
index_defs.append(f"INDEX `idx_{
|
500
|
+
index_defs.append(f"INDEX `idx_{normalized_idx_col}` ({safe_idx_col})")
|
501
|
+
else:
|
502
|
+
logger.warning('索引列不存在于表结构中,跳过', {
|
503
|
+
'库': db_name,
|
504
|
+
'表': table_name,
|
505
|
+
'列': idx_col,
|
506
|
+
'规范化后': normalized_idx_col,
|
507
|
+
'可用列': list(set_typ.keys())
|
508
|
+
})
|
468
509
|
|
469
510
|
# UNIQUE KEY定义
|
470
511
|
unique_defs = []
|
@@ -483,12 +524,48 @@ class MySQLUploader:
|
|
483
524
|
'主键': primary_keys
|
484
525
|
})
|
485
526
|
continue
|
486
|
-
|
487
|
-
|
527
|
+
|
528
|
+
# 验证唯一约束的列是否存在于set_typ中
|
529
|
+
valid_unique_cols = []
|
530
|
+
for col in unique_cols:
|
531
|
+
normalized_col = self._normalize_col(col)
|
532
|
+
if normalized_col in set_typ:
|
533
|
+
valid_unique_cols.append(col)
|
534
|
+
else:
|
535
|
+
logger.warning('唯一约束列不存在于表结构中,跳过', {
|
536
|
+
'库': db_name,
|
537
|
+
'表': table_name,
|
538
|
+
'列': col,
|
539
|
+
'规范化后': normalized_col,
|
540
|
+
'可用列': list(set_typ.keys())
|
541
|
+
})
|
542
|
+
|
543
|
+
if not valid_unique_cols:
|
544
|
+
logger.warning('唯一约束的所有列都不存在于表结构中,跳过整个约束', {
|
545
|
+
'库': db_name,
|
546
|
+
'表': table_name,
|
547
|
+
'原始约束': unique_cols
|
548
|
+
})
|
549
|
+
continue
|
550
|
+
|
551
|
+
safe_unique_cols = [_index_col_sql(col) for col in valid_unique_cols]
|
552
|
+
unique_name = f"uniq_{'_'.join([self._normalize_col(c) for c in valid_unique_cols])}"
|
488
553
|
unique_defs.append(f"UNIQUE KEY `{unique_name}` ({','.join(safe_unique_cols)})")
|
489
554
|
|
490
555
|
index_defs = list(set(index_defs))
|
491
556
|
all_defs = column_defs + [primary_key_sql] + index_defs + unique_defs
|
557
|
+
|
558
|
+
# 添加调试日志
|
559
|
+
logger.debug('建表SQL生成', {
|
560
|
+
'库': db_name,
|
561
|
+
'表': table_name,
|
562
|
+
'列定义': column_defs,
|
563
|
+
'主键': primary_key_sql,
|
564
|
+
'索引': index_defs,
|
565
|
+
'唯一约束': unique_defs,
|
566
|
+
'set_typ键': list(set_typ.keys())
|
567
|
+
})
|
568
|
+
|
492
569
|
sql = f"""
|
493
570
|
CREATE TABLE IF NOT EXISTS `{db_name}`.`{table_name}` (
|
494
571
|
{','.join(all_defs)}
|
@@ -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=621mRjqeg4oOiqnQ029WztdhGqT609a4KpKuDnjD0zY,18
|
3
3
|
mdbq/log/__init__.py,sha256=Mpbrav0s0ifLL7lVDAuePEi1hJKiSHhxcv1byBKDl5E,15
|
4
4
|
mdbq/log/mylogger.py,sha256=kPe3wsQNaB1slfX-Z7VMqzZoMoqPfc7ylYXZDBeFzzI,24945
|
5
5
|
mdbq/myconf/__init__.py,sha256=jso1oHcy6cJEfa7udS_9uO5X6kZLoPBF8l3wCYmr5dM,18
|
@@ -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=rSlAIUNfTrI25vYjoq9OpEbzsbrzc0m8mxb_0G7h878,45496
|
11
11
|
mdbq/mysql/unique_.py,sha256=MaztT-WIyEQUs-OOYY4pFulgHVcXR1BfCy3QUz0XM_U,21127
|
12
|
-
mdbq/mysql/uploader.py,sha256=
|
12
|
+
mdbq/mysql/uploader.py,sha256=V7XPuYncg3Fvj6YhIiqwD6c4s3tLCKBYHwySYm69Av4,92334
|
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
|
@@ -22,7 +22,7 @@ mdbq/pbix/refresh_all.py,sha256=OBT9EewSZ0aRS9vL_FflVn74d4l2G00wzHiikCC4TC0,5926
|
|
22
22
|
mdbq/redis/__init__.py,sha256=YtgBlVSMDphtpwYX248wGge1x-Ex_mMufz4-8W0XRmA,12
|
23
23
|
mdbq/redis/getredis.py,sha256=vpBuNc22uj9Vr-_Dh25_wpwWM1e-072EAAIBdB_IpL0,23494
|
24
24
|
mdbq/spider/__init__.py,sha256=RBMFXGy_jd1HXZhngB2T2XTvJqki8P_Fr-pBcwijnew,18
|
25
|
-
mdbq-4.0.
|
26
|
-
mdbq-4.0.
|
27
|
-
mdbq-4.0.
|
28
|
-
mdbq-4.0.
|
25
|
+
mdbq-4.0.59.dist-info/METADATA,sha256=HuBoWGvOsn7xMnETkobaMBb3kgBFgAY_UE48Wk42lak,364
|
26
|
+
mdbq-4.0.59.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
|
27
|
+
mdbq-4.0.59.dist-info/top_level.txt,sha256=2FQ-uLnCSB-OwFiWntzmwosW3X2Xqsg0ewh1axsaylA,5
|
28
|
+
mdbq-4.0.59.dist-info/RECORD,,
|
File without changes
|
File without changes
|