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 CHANGED
@@ -1 +1 @@
1
- VERSION = '4.0.57'
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.error('无法清理异常标识符', {'原始标识符': identifier})
346
- raise ValueError(f"无法清理异常标识符: `{identifier}`")
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
- safe_primary_keys = [_index_col_sql(pk) for pk in primary_keys]
453
- primary_key_sql = f"PRIMARY KEY ({','.join(safe_primary_keys)})"
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
- if idx_col in set_typ:
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_{self._normalize_col(idx_col)}` ({safe_idx_col})")
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
- safe_unique_cols = [_index_col_sql(col) for col in unique_cols]
487
- unique_name = f"uniq_{'_'.join([self._normalize_col(c) for c in unique_cols])}"
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,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: mdbq
3
- Version: 4.0.57
3
+ Version: 4.0.59
4
4
  Home-page: https://pypi.org/project/mdbq
5
5
  Author: xigua,
6
6
  Author-email: 2587125111@qq.com
@@ -1,5 +1,5 @@
1
1
  mdbq/__init__.py,sha256=Il5Q9ATdX8yXqVxtP_nYqUhExzxPC_qk_WXQ_4h0exg,16
2
- mdbq/__version__.py,sha256=h4Mph1EXalN5pS5TeCj37jNZiUp31v2ZO-LykNJBpY0,18
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=dJRAtj-IebPgOHvKKeu-CqoeqfSaRqusSBgt_hXgNdw,88926
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.57.dist-info/METADATA,sha256=TfW6yMLFlhUzAu4IqtGdSijN5UwnmJHvj3absBB8b5Y,364
26
- mdbq-4.0.57.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
27
- mdbq-4.0.57.dist-info/top_level.txt,sha256=2FQ-uLnCSB-OwFiWntzmwosW3X2Xqsg0ewh1axsaylA,5
28
- mdbq-4.0.57.dist-info/RECORD,,
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