mdbq 4.0.58__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.58'
1
+ VERSION = '4.0.59'
mdbq/mysql/uploader.py CHANGED
@@ -348,6 +348,10 @@ class MySQLUploader:
348
348
  import hashlib
349
349
  hash_suffix = hashlib.md5(identifier.encode('utf-8')).hexdigest()[:8]
350
350
  cleaned = f'unknown_col_{hash_suffix}'
351
+
352
+ # 确保标识符不以数字开头(MySQL要求)
353
+ if cleaned and cleaned[0].isdigit():
354
+ cleaned = f'col_{cleaned}'
351
355
  mysql_keywords = {
352
356
  'select', 'insert', 'update', 'delete', 'from', 'where', 'and', 'or',
353
357
  'not', 'like', 'in', 'is', 'null', 'true', 'false', 'between'
@@ -452,9 +456,33 @@ class MySQLUploader:
452
456
 
453
457
  # 处理主键
454
458
  if primary_keys and len(primary_keys) > 0:
455
- # 如果指定了主键,直接使用指定的主键
456
- safe_primary_keys = [_index_col_sql(pk) for pk in primary_keys]
457
- 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`)"
458
486
  else:
459
487
  # 如果没有指定主键,使用id作为主键
460
488
  primary_key_sql = f"PRIMARY KEY (`id`)"
@@ -466,9 +494,18 @@ class MySQLUploader:
466
494
  index_defs.append(f"INDEX `idx_{self._normalize_col(date_column)}` ({safe_date_col})")
467
495
  if indexes:
468
496
  for idx_col in indexes:
469
- if idx_col in set_typ:
497
+ normalized_idx_col = self._normalize_col(idx_col)
498
+ if normalized_idx_col in set_typ:
470
499
  safe_idx_col = _index_col_sql(idx_col)
471
- 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
+ })
472
509
 
473
510
  # UNIQUE KEY定义
474
511
  unique_defs = []
@@ -487,12 +524,48 @@ class MySQLUploader:
487
524
  '主键': primary_keys
488
525
  })
489
526
  continue
490
- safe_unique_cols = [_index_col_sql(col) for col in unique_cols]
491
- 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])}"
492
553
  unique_defs.append(f"UNIQUE KEY `{unique_name}` ({','.join(safe_unique_cols)})")
493
554
 
494
555
  index_defs = list(set(index_defs))
495
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
+
496
569
  sql = f"""
497
570
  CREATE TABLE IF NOT EXISTS `{db_name}`.`{table_name}` (
498
571
  {','.join(all_defs)}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: mdbq
3
- Version: 4.0.58
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=FGamKzRwfsSH6kaKP04rb3ZvfCDmWDLKJl_Kc1XCyJM,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=A9fYQqxGl5sAFzxWNcOUZTQiLzqwkAGHonG_U8du-30,89178
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.58.dist-info/METADATA,sha256=Q1iFXOy4pq_og9Zx4320c-1hJ5qC4DstaOEQeQEX0-4,364
26
- mdbq-4.0.58.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
27
- mdbq-4.0.58.dist-info/top_level.txt,sha256=2FQ-uLnCSB-OwFiWntzmwosW3X2Xqsg0ewh1axsaylA,5
28
- mdbq-4.0.58.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