mdbq 3.11.3__py3-none-any.whl → 3.11.4__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 +12 -9
- {mdbq-3.11.3.dist-info → mdbq-3.11.4.dist-info}/METADATA +1 -1
- {mdbq-3.11.3.dist-info → mdbq-3.11.4.dist-info}/RECORD +6 -6
- {mdbq-3.11.3.dist-info → mdbq-3.11.4.dist-info}/WHEEL +0 -0
- {mdbq-3.11.3.dist-info → mdbq-3.11.4.dist-info}/top_level.txt +0 -0
mdbq/__version__.py
CHANGED
@@ -1 +1 @@
|
|
1
|
-
VERSION = '3.11.
|
1
|
+
VERSION = '3.11.4'
|
mdbq/mysql/uploader.py
CHANGED
@@ -305,12 +305,12 @@ class MySQLUploader:
|
|
305
305
|
|
306
306
|
:param table_name: 基础表名
|
307
307
|
:param date_value: 日期值
|
308
|
-
:param partition_by: 分表方式 ('year' 或 'month')
|
308
|
+
:param partition_by: 分表方式 ('year' 或 'month' 或 'none')
|
309
309
|
:return: 分表名称
|
310
310
|
:raises ValueError: 如果日期格式无效或分表方式无效
|
311
311
|
"""
|
312
312
|
try:
|
313
|
-
date_obj = self._validate_datetime(date_value, True)
|
313
|
+
date_obj = self._validate_datetime(value=date_value, date_type=True, no_log=False)
|
314
314
|
except ValueError:
|
315
315
|
logger.error('无效的日期格式', {'表': table_name, '日期值': date_value})
|
316
316
|
raise ValueError(f"`{table_name}` 无效的日期格式: `{date_value}`")
|
@@ -449,12 +449,13 @@ class MySQLUploader:
|
|
449
449
|
conn.rollback()
|
450
450
|
raise
|
451
451
|
|
452
|
-
def _validate_datetime(self, value: str, date_type: bool = False) -> Any:
|
452
|
+
def _validate_datetime(self, value: str, date_type: bool = False, no_log: bool = False) -> Any:
|
453
453
|
"""
|
454
454
|
验证并标准化日期时间格式
|
455
455
|
|
456
456
|
:param value: 日期时间值
|
457
457
|
:param date_type: 是否返回日期类型(True)或字符串(False)
|
458
|
+
:param no_log: 记录日志,默认为False
|
458
459
|
:return: 标准化后的日期时间字符串或日期对象
|
459
460
|
:raises ValueError: 当日期格式无效时抛出
|
460
461
|
"""
|
@@ -482,7 +483,8 @@ class MySQLUploader:
|
|
482
483
|
return result
|
483
484
|
except ValueError:
|
484
485
|
continue
|
485
|
-
|
486
|
+
if not no_log:
|
487
|
+
logger.error('无效的日期格式', {'值': value})
|
486
488
|
raise ValueError(f"无效的日期格式: `{value}`")
|
487
489
|
|
488
490
|
def _validate_value(self, value: Any, column_type: str, allow_null: bool, db_name: str = None, table_name: str = None, col_name: str = None) -> Any:
|
@@ -538,7 +540,7 @@ class MySQLUploader:
|
|
538
540
|
return value.strftime('%Y-%m-%d %H:%M:%S')
|
539
541
|
elif isinstance(value, str):
|
540
542
|
try:
|
541
|
-
return self._validate_datetime(value)
|
543
|
+
return self._validate_datetime(value=value, date_type=False, no_log=False)
|
542
544
|
except ValueError as e:
|
543
545
|
logger.error('无效日期格式', {
|
544
546
|
'库': db_name, '表': table_name, '列': col_name, '值': value, '错误': str(e)
|
@@ -653,11 +655,12 @@ class MySQLUploader:
|
|
653
655
|
transaction_mode=transaction_mode
|
654
656
|
)
|
655
657
|
|
656
|
-
def _infer_data_type(self, value: Any) -> str:
|
658
|
+
def _infer_data_type(self, value: Any, no_log: bool = False) -> str:
|
657
659
|
"""
|
658
660
|
根据值推断合适的MySQL数据类型
|
659
661
|
|
660
662
|
:param value: 要推断的值
|
663
|
+
:param no_log: 记录日志,默认为False
|
661
664
|
:return: MySQL数据类型字符串
|
662
665
|
"""
|
663
666
|
if value is None or str(value).lower() in ['', 'none', 'nan']:
|
@@ -695,7 +698,7 @@ class MySQLUploader:
|
|
695
698
|
elif isinstance(value, str):
|
696
699
|
# 尝试判断是否是日期时间
|
697
700
|
try:
|
698
|
-
self._validate_datetime(value)
|
701
|
+
self._validate_datetime(value=value, date_type=False, no_log=no_log)
|
699
702
|
return 'DATETIME'
|
700
703
|
except ValueError:
|
701
704
|
pass
|
@@ -799,7 +802,7 @@ class MySQLUploader:
|
|
799
802
|
sample_values = [row[col] for row in data if col in row and row[col] is not None][:5]
|
800
803
|
inferred_type = None
|
801
804
|
for val in sample_values:
|
802
|
-
inferred_type = self._infer_data_type(val)
|
805
|
+
inferred_type = self._infer_data_type(val, no_log=True) # 推断日期类型不记录日志, 避免日志噪音过多
|
803
806
|
if inferred_type:
|
804
807
|
break
|
805
808
|
if not inferred_type:
|
@@ -864,7 +867,7 @@ class MySQLUploader:
|
|
864
867
|
:param check_duplicate: 是否检查重复数据,默认为False
|
865
868
|
:param duplicate_columns: 用于检查重复的列,可选
|
866
869
|
:param allow_null: 是否允许空值,默认为False
|
867
|
-
:param partition_by: 分表方式('year'
|
870
|
+
:param partition_by: 分表方式('year'、'month'、'None'),可选
|
868
871
|
:param partition_date_column: 用于分表的日期列名,默认为'日期'
|
869
872
|
:param auto_create: 表不存在时是否自动创建,默认为True
|
870
873
|
:param indexes: 需要创建索引的列列表,可选
|
@@ -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=1DrHdseKlRiF6aYmgAcpC6gl2Za3P3wK0gh0svyeqSQ,18
|
3
3
|
mdbq/aggregation/__init__.py,sha256=EeDqX2Aml6SPx8363J-v1lz0EcZtgwIBYyCJV6CcEDU,40
|
4
4
|
mdbq/aggregation/query_data.py,sha256=nxL8hSy8yI1QLlqnkTNHHQSxRfo-6WKL5OA-N4xLB7c,179832
|
5
5
|
mdbq/config/__init__.py,sha256=jso1oHcy6cJEfa7udS_9uO5X6kZLoPBF8l3wCYmr5dM,18
|
@@ -11,7 +11,7 @@ mdbq/mysql/__init__.py,sha256=A_DPJyAoEvTSFojiI2e94zP0FKtCkkwKP1kYUCSyQzo,11
|
|
11
11
|
mdbq/mysql/deduplicator.py,sha256=bIV010UkFfSUONY6-756x3tDVO4k6q3pqxoY3Z2xT-k,32990
|
12
12
|
mdbq/mysql/mysql.py,sha256=Kjpi-LL00WQUmTTOfhEBsNrmo4-4kFFJzrHbVKfqiBE,56770
|
13
13
|
mdbq/mysql/s_query.py,sha256=dlnrVJ3-Vp1Suv9CNbPxyYSRqRJUHjOpF39tb2F-wBc,10190
|
14
|
-
mdbq/mysql/uploader.py,sha256=
|
14
|
+
mdbq/mysql/uploader.py,sha256=K6PBLkmur-2dYdJ78_wFQPolSS44EiQfetDM0owy4E0,61699
|
15
15
|
mdbq/other/__init__.py,sha256=jso1oHcy6cJEfa7udS_9uO5X6kZLoPBF8l3wCYmr5dM,18
|
16
16
|
mdbq/other/download_sku_picture.py,sha256=YU8DxKMXbdeE1OOKEA848WVp62jYHw5O4tXTjUdq9H0,44832
|
17
17
|
mdbq/other/otk.py,sha256=iclBIFbQbhlqzUbcMMoePXBpcP1eZ06ZtjnhcA_EbmE,7241
|
@@ -24,7 +24,7 @@ mdbq/redis/__init__.py,sha256=YtgBlVSMDphtpwYX248wGge1x-Ex_mMufz4-8W0XRmA,12
|
|
24
24
|
mdbq/redis/getredis.py,sha256=YHgCKO8mEsslwet33K5tGss-nrDDwPnOSlhA9iBu0jY,24078
|
25
25
|
mdbq/spider/__init__.py,sha256=RBMFXGy_jd1HXZhngB2T2XTvJqki8P_Fr-pBcwijnew,18
|
26
26
|
mdbq/spider/aikucun.py,sha256=cqK-JRd_DHbToC7hyo83m8o97NZkJFqmB2xBtr6aAVU,20961
|
27
|
-
mdbq-3.11.
|
28
|
-
mdbq-3.11.
|
29
|
-
mdbq-3.11.
|
30
|
-
mdbq-3.11.
|
27
|
+
mdbq-3.11.4.dist-info/METADATA,sha256=Tnz1f-xIVia0AgsFI4nxuiHIjcfT1bxHk5zxHn23q9g,364
|
28
|
+
mdbq-3.11.4.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
|
29
|
+
mdbq-3.11.4.dist-info/top_level.txt,sha256=2FQ-uLnCSB-OwFiWntzmwosW3X2Xqsg0ewh1axsaylA,5
|
30
|
+
mdbq-3.11.4.dist-info/RECORD,,
|
File without changes
|
File without changes
|