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.
- {mdbq-4.1.8 → mdbq-4.1.10}/PKG-INFO +1 -1
- mdbq-4.1.10/mdbq/__version__.py +1 -0
- {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/mysql/uploader.py +73 -54
- {mdbq-4.1.8 → mdbq-4.1.10}/mdbq.egg-info/PKG-INFO +1 -1
- mdbq-4.1.8/mdbq/__version__.py +0 -1
- {mdbq-4.1.8 → mdbq-4.1.10}/README.txt +0 -0
- {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/__init__.py +0 -0
- {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/auth/__init__.py +0 -0
- {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/auth/auth_backend.py +0 -0
- {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/auth/crypto.py +0 -0
- {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/auth/rate_limiter.py +0 -0
- {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/js/__init__.py +0 -0
- {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/js/jc.py +0 -0
- {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/log/__init__.py +0 -0
- {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/log/mylogger.py +0 -0
- {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/myconf/__init__.py +0 -0
- {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/myconf/myconf.py +0 -0
- {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/mysql/__init__.py +0 -0
- {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/mysql/deduplicator.py +0 -0
- {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/mysql/mysql.py +0 -0
- {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/mysql/s_query.py +0 -0
- {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/mysql/unique_.py +0 -0
- {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/other/__init__.py +0 -0
- {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/other/download_sku_picture.py +0 -0
- {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/other/error_handler.py +0 -0
- {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/other/otk.py +0 -0
- {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/other/pov_city.py +0 -0
- {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/other/ua_sj.py +0 -0
- {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/pbix/__init__.py +0 -0
- {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/pbix/pbix_refresh.py +0 -0
- {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/pbix/refresh_all.py +0 -0
- {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/redis/__init__.py +0 -0
- {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/redis/getredis.py +0 -0
- {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/redis/redis_cache.py +0 -0
- {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/route/__init__.py +0 -0
- {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/route/analytics.py +0 -0
- {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/route/monitor.py +0 -0
- {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/route/routes.py +0 -0
- {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/selenium/__init__.py +0 -0
- {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/selenium/get_driver.py +0 -0
- {mdbq-4.1.8 → mdbq-4.1.10}/mdbq/spider/__init__.py +0 -0
- {mdbq-4.1.8 → mdbq-4.1.10}/mdbq.egg-info/SOURCES.txt +0 -0
- {mdbq-4.1.8 → mdbq-4.1.10}/mdbq.egg-info/dependency_links.txt +0 -0
- {mdbq-4.1.8 → mdbq-4.1.10}/mdbq.egg-info/top_level.txt +0 -0
- {mdbq-4.1.8 → mdbq-4.1.10}/setup.cfg +0 -0
- {mdbq-4.1.8 → mdbq-4.1.10}/setup.py +0 -0
|
@@ -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
|
-
#
|
|
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
|
|
mdbq-4.1.8/mdbq/__version__.py
DELETED
|
@@ -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
|
|
File without changes
|
|
File without changes
|