mdbq 4.1.8__tar.gz → 4.1.10__tar.gz

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.

Potentially problematic release.


This version of mdbq might be problematic. Click here for more details.

Files changed (46) hide show
  1. {mdbq-4.1.8 → mdbq-4.1.10}/PKG-INFO +1 -1
  2. mdbq-4.1.10/mdbq/__version__.py +1 -0
  3. {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/mysql/uploader.py +73 -54
  4. {mdbq-4.1.8 → mdbq-4.1.10}/mdbq.egg-info/PKG-INFO +1 -1
  5. mdbq-4.1.8/mdbq/__version__.py +0 -1
  6. {mdbq-4.1.8 → mdbq-4.1.10}/README.txt +0 -0
  7. {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/__init__.py +0 -0
  8. {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/auth/__init__.py +0 -0
  9. {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/auth/auth_backend.py +0 -0
  10. {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/auth/crypto.py +0 -0
  11. {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/auth/rate_limiter.py +0 -0
  12. {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/js/__init__.py +0 -0
  13. {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/js/jc.py +0 -0
  14. {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/log/__init__.py +0 -0
  15. {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/log/mylogger.py +0 -0
  16. {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/myconf/__init__.py +0 -0
  17. {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/myconf/myconf.py +0 -0
  18. {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/mysql/__init__.py +0 -0
  19. {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/mysql/deduplicator.py +0 -0
  20. {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/mysql/mysql.py +0 -0
  21. {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/mysql/s_query.py +0 -0
  22. {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/mysql/unique_.py +0 -0
  23. {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/other/__init__.py +0 -0
  24. {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/other/download_sku_picture.py +0 -0
  25. {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/other/error_handler.py +0 -0
  26. {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/other/otk.py +0 -0
  27. {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/other/pov_city.py +0 -0
  28. {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/other/ua_sj.py +0 -0
  29. {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/pbix/__init__.py +0 -0
  30. {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/pbix/pbix_refresh.py +0 -0
  31. {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/pbix/refresh_all.py +0 -0
  32. {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/redis/__init__.py +0 -0
  33. {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/redis/getredis.py +0 -0
  34. {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/redis/redis_cache.py +0 -0
  35. {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/route/__init__.py +0 -0
  36. {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/route/analytics.py +0 -0
  37. {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/route/monitor.py +0 -0
  38. {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/route/routes.py +0 -0
  39. {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/selenium/__init__.py +0 -0
  40. {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/selenium/get_driver.py +0 -0
  41. {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/spider/__init__.py +0 -0
  42. {mdbq-4.1.8 → mdbq-4.1.10}/mdbq.egg-info/SOURCES.txt +0 -0
  43. {mdbq-4.1.8 → mdbq-4.1.10}/mdbq.egg-info/dependency_links.txt +0 -0
  44. {mdbq-4.1.8 → mdbq-4.1.10}/mdbq.egg-info/top_level.txt +0 -0
  45. {mdbq-4.1.8 → mdbq-4.1.10}/setup.cfg +0 -0
  46. {mdbq-4.1.8 → mdbq-4.1.10}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: mdbq
3
- Version: 4.1.8
3
+ Version: 4.1.10
4
4
  Home-page: https://pypi.org/project/mdbq
5
5
  Author: xigua,
6
6
  Author-email: 2587125111@qq.com
@@ -0,0 +1 @@
1
+ VERSION = '4.1.10'
@@ -656,6 +656,57 @@ class MySQLUploader:
656
656
  logger.error('无效的日期格式', {'值': value})
657
657
  raise ValueError(f"无效的日期格式: `{value}`")
658
658
 
659
+ def _get_fallback_value(self, column_type_lower: str, allow_null: bool, db_name: str = None, table_name: str = None, col_name: str = None, original_value: Any = None) -> Any:
660
+ """
661
+ 获取空值的兜底填充值
662
+ """
663
+ # 兜底填充值映射
664
+ fallback_map = {
665
+ 'int': 0,
666
+ 'bigint': 0,
667
+ 'tinyint': 0,
668
+ 'smallint': 0,
669
+ 'mediumint': 0,
670
+ 'decimal': 0.0,
671
+ 'float': 0.0,
672
+ 'double': 0.0,
673
+ 'date': '1970-01-01',
674
+ 'datetime': '1970-01-01 00:00:00',
675
+ 'timestamp': '1970-01-01 00:00:00',
676
+ 'json': '{}',
677
+ 'varchar': 'none',
678
+ 'text': 'none',
679
+ 'char': 'none',
680
+ 'mediumtext': 'none',
681
+ 'longtext': 'none',
682
+ 'enum': None, # enum类型需要特殊处理,使用第一个可选值
683
+ 'set': '', # set类型默认为空字符串
684
+ }
685
+
686
+ fallback = 'none'
687
+ for typ, val in fallback_map.items():
688
+ if typ in column_type_lower:
689
+ if typ == 'enum' and val is None:
690
+ # 对于enum类型,使用第一个可选值作为默认值
691
+ enum_values = re.findall(r"['\"]([^'\"]*)['\"]", column_type_lower)
692
+ fallback = enum_values[0] if enum_values else 'none'
693
+ else:
694
+ fallback = val
695
+ break
696
+
697
+ if not allow_null:
698
+ logger.warning("该列不允许为空值", {
699
+ "库": db_name,
700
+ "表": table_name,
701
+ "allow_null": allow_null,
702
+ "列": col_name,
703
+ "值": original_value,
704
+ "兜底值": fallback
705
+ })
706
+ return fallback # 直接返回兜底值,而不是抛出异常
707
+
708
+ return None # 允许空值时返回None
709
+
659
710
  def _convert_to_int(self, value):
660
711
  """
661
712
  尝试将value转换为int
@@ -729,7 +780,28 @@ class MySQLUploader:
729
780
  """
730
781
  column_type_lower = column_type.lower() if column_type else ''
731
782
 
732
- # JSON类型验证和转换(优先处理,避免pd.isna的问题)
783
+ # 统一的空值检查(None、空字符串、NaN)
784
+ is_empty_value = False
785
+ if value is None:
786
+ is_empty_value = True
787
+ elif value == '':
788
+ # 空字符串对于字符串类型是有效值
789
+ if any(t in column_type_lower for t in ['varchar', 'text', 'char', 'mediumtext', 'longtext']):
790
+ return ""
791
+ is_empty_value = True
792
+ else:
793
+ # 检查NaN值(避免对列表和字典使用pd.isna)
794
+ if not isinstance(value, (list, dict)):
795
+ try:
796
+ is_empty_value = pd.isna(value) or (isinstance(value, (float, Decimal)) and math.isinf(value))
797
+ except (ValueError, TypeError):
798
+ is_empty_value = False
799
+
800
+ # 统一处理空值
801
+ if is_empty_value:
802
+ return self._get_fallback_value(column_type_lower, allow_null, db_name, table_name, col_name, value)
803
+
804
+ # JSON类型验证和转换
733
805
  if 'json' in column_type_lower:
734
806
  if isinstance(value, (dict, list)):
735
807
  try:
@@ -748,59 +820,6 @@ class MySQLUploader:
748
820
  else:
749
821
  # 其他类型转换为字符串
750
822
  return str(value)
751
-
752
- # 统一判断None/NaN(排除列表和字典类型)
753
- if value == '':
754
- if any(t in column_type_lower for t in ['varchar', 'text', 'char', 'mediumtext', 'longtext']):
755
- return ""
756
-
757
- # 安全地检查NaN值,避免对列表和字典使用pd.isna
758
- is_nan = False
759
- if isinstance(value, (list, dict)):
760
- is_nan = False # 列表和字典不是NaN
761
- else:
762
- try:
763
- is_nan = pd.isna(value) or (isinstance(value, (float, Decimal)) and math.isinf(value))
764
- except (ValueError, TypeError):
765
- is_nan = False
766
-
767
- if value == '' or is_nan:
768
- # 兜底填充值映射
769
- fallback_map = {
770
- 'int': 0,
771
- 'bigint': 0,
772
- 'tinyint': 0,
773
- 'smallint': 0,
774
- 'mediumint': 0,
775
- 'decimal': 0.0,
776
- 'float': 0.0,
777
- 'double': 0.0,
778
- 'date': '1970-01-01',
779
- 'datetime': '1970-01-01 00:00:00',
780
- 'timestamp': '1970-01-01 00:00:00',
781
- 'json': '{}',
782
- 'varchar': 'none',
783
- 'text': 'none',
784
- 'char': 'none',
785
- 'mediumtext': 'none',
786
- 'longtext': 'none',
787
- 'enum': None, # enum类型需要特殊处理,使用第一个可选值
788
- 'set': '', # set类型默认为空字符串
789
- }
790
- fallback = 'none'
791
- for typ, val in fallback_map.items():
792
- if typ in column_type_lower:
793
- if typ == 'enum' and val is None:
794
- # 对于enum类型,使用第一个可选值作为默认值
795
- enum_values = re.findall(r"['\"]([^'\"]*)['\"]", column_type)
796
- fallback = enum_values[0] if enum_values else 'none'
797
- else:
798
- fallback = val
799
- break
800
- if not allow_null:
801
- logger.warning("该列不允许为空值", {"库": db_name, "表": table_name, "allow_null": allow_null, "列": col_name, "值": value, "兜底值": fallback})
802
- raise ValueError("该列不允许为空值")
803
- return fallback
804
823
 
805
824
  original_value = value
806
825
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: mdbq
3
- Version: 4.1.8
3
+ Version: 4.1.10
4
4
  Home-page: https://pypi.org/project/mdbq
5
5
  Author: xigua,
6
6
  Author-email: 2587125111@qq.com
@@ -1 +0,0 @@
1
- VERSION = '4.1.8'
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes