mdbq 4.0.4__py3-none-any.whl → 4.0.5__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/aggregation/query_data.py +54 -87
- mdbq/mysql/uploader.py +13 -6
- {mdbq-4.0.4.dist-info → mdbq-4.0.5.dist-info}/METADATA +1 -1
- {mdbq-4.0.4.dist-info → mdbq-4.0.5.dist-info}/RECORD +7 -7
- {mdbq-4.0.4.dist-info → mdbq-4.0.5.dist-info}/WHEEL +0 -0
- {mdbq-4.0.4.dist-info → mdbq-4.0.5.dist-info}/top_level.txt +0 -0
mdbq/__version__.py
CHANGED
@@ -1 +1 @@
|
|
1
|
-
VERSION = '4.0.
|
1
|
+
VERSION = '4.0.5'
|
mdbq/aggregation/query_data.py
CHANGED
@@ -87,108 +87,90 @@ def upload_data_decorator(**upload_kwargs):
|
|
87
87
|
def decorator(func):
|
88
88
|
@wraps(func)
|
89
89
|
def wrapper(*args, **kwargs):
|
90
|
+
db_name = None
|
91
|
+
table_name = None
|
90
92
|
try:
|
91
|
-
#
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
93
|
+
# 获取函数签名和参数
|
94
|
+
sig = inspect.signature(func)
|
95
|
+
bound_args = sig.bind(*args, **kwargs)
|
96
|
+
args_dict = bound_args.arguments
|
97
|
+
|
98
|
+
# 获取所需参数
|
99
|
+
def get_param_value(param_name, alternatives=None):
|
100
|
+
if alternatives is None:
|
101
|
+
alternatives = [param_name]
|
102
|
+
# 从 kwargs 或 args_dict 中获取参数值
|
103
|
+
for key in alternatives:
|
104
|
+
if key in kwargs:
|
105
|
+
return kwargs[key]
|
106
|
+
if key in args_dict:
|
107
|
+
return args_dict[key]
|
108
|
+
return None
|
109
|
+
|
110
|
+
# 获取参数值
|
111
|
+
set_type = get_param_value('set_type', ['set_type', 'set_typ'])
|
112
|
+
db_name = get_param_value('db_name')
|
113
|
+
table_name = get_param_value('table_name')
|
108
114
|
|
109
115
|
# 执行原始函数
|
110
116
|
result = func(*args, **kwargs)
|
111
117
|
|
112
|
-
# 如果返回 None,直接返回
|
113
118
|
if result is None:
|
114
119
|
return None
|
115
|
-
|
116
|
-
#
|
120
|
+
|
121
|
+
# 处理 DataFrame 结果
|
117
122
|
if isinstance(result, pd.DataFrame):
|
118
|
-
# 调整列顺序
|
119
123
|
if set_type is not None:
|
120
124
|
result = reorder_columns(result, set_type)
|
121
|
-
|
122
|
-
|
125
|
+
|
126
|
+
# 合并参数
|
127
|
+
merged_kwargs = {
|
123
128
|
'check_duplicate': False,
|
124
129
|
'update_on_duplicate': True,
|
125
130
|
'allow_null': False,
|
126
|
-
'transaction_mode': 'batch'
|
131
|
+
'transaction_mode': 'batch',
|
132
|
+
**upload_kwargs
|
127
133
|
}
|
128
|
-
# 更新参数,优先使用装饰器参数
|
129
|
-
merged_kwargs = {**default_kwargs, **upload_kwargs}
|
130
134
|
|
131
|
-
|
132
|
-
uld.upload_data(
|
133
|
-
data=result,
|
134
|
-
**merged_kwargs
|
135
|
-
)
|
135
|
+
uld.upload_data(data=result, **merged_kwargs)
|
136
136
|
return True
|
137
|
-
|
138
|
-
#
|
137
|
+
|
138
|
+
# 处理元组结果
|
139
139
|
elif isinstance(result, tuple):
|
140
|
-
# 检查元组长度
|
141
140
|
if len(result) < 2:
|
142
|
-
logger.warning('函数返回的元组长度小于2,直接返回原结果,不执行上传', {'函数': func.__name__})
|
141
|
+
logger.warning('函数返回的元组长度小于2,直接返回原结果,不执行上传', {'函数': func.__name__, '库': db_name, '表': table_name})
|
143
142
|
return result
|
144
|
-
|
145
|
-
# 获取前两个元素
|
143
|
+
|
146
144
|
df, extra_kwargs = result[0], result[1]
|
147
145
|
|
148
|
-
# 检查第一个元素是否为DataFrame
|
149
146
|
if not isinstance(df, pd.DataFrame):
|
150
|
-
logger.warning('函数返回的元组第一个元素不是DataFrame,直接返回原结果,不执行上传', {'函数': func.__name__})
|
147
|
+
logger.warning('函数返回的元组第一个元素不是DataFrame,直接返回原结果,不执行上传', {'函数': func.__name__, '库': db_name, '表': table_name})
|
151
148
|
return result
|
152
|
-
|
153
|
-
# 调整列顺序
|
149
|
+
|
154
150
|
if set_type is not None:
|
155
151
|
df = reorder_columns(df, set_type)
|
156
|
-
# 保持元组结构
|
157
152
|
result = (df, extra_kwargs) + result[2:]
|
158
|
-
|
159
|
-
|
160
|
-
merged_kwargs
|
161
|
-
|
162
|
-
# 设置默认值
|
163
|
-
default_kwargs = {
|
153
|
+
|
154
|
+
# 合并参数
|
155
|
+
merged_kwargs = {
|
164
156
|
'check_duplicate': False,
|
165
157
|
'update_on_duplicate': True,
|
166
158
|
'allow_null': False,
|
167
|
-
'transaction_mode': 'batch'
|
159
|
+
'transaction_mode': 'batch',
|
160
|
+
**upload_kwargs,
|
161
|
+
**extra_kwargs
|
168
162
|
}
|
169
|
-
# 更新参数,优先使用装饰器参数
|
170
|
-
for key, value in default_kwargs.items():
|
171
|
-
if key not in merged_kwargs:
|
172
|
-
merged_kwargs[key] = value
|
173
163
|
|
174
|
-
|
175
|
-
uld.upload_data(
|
176
|
-
data=df,
|
177
|
-
**merged_kwargs
|
178
|
-
)
|
164
|
+
uld.upload_data(data=df, **merged_kwargs)
|
179
165
|
|
180
|
-
|
181
|
-
|
182
|
-
return result
|
183
|
-
return True
|
184
|
-
|
185
|
-
# 其他情况直接返回结果
|
166
|
+
return result if len(result) > 2 else True
|
167
|
+
|
186
168
|
return result
|
187
|
-
|
169
|
+
|
188
170
|
except Exception as e:
|
189
|
-
logger.error('数据上传失败', {'函数': func.__name__, '错误': str(e)})
|
171
|
+
logger.error('数据上传失败', {'函数': func.__name__, '库': db_name, '表': table_name, '错误': str(e)})
|
190
172
|
return False
|
191
|
-
|
173
|
+
|
192
174
|
return wrapper
|
193
175
|
return decorator
|
194
176
|
|
@@ -2019,7 +2001,7 @@ class MysqlDatasQuery:
|
|
2019
2001
|
'partition_date_column': '日期', # 用于分表的日期列名,默认为'日期'
|
2020
2002
|
'indexes': [], # 普通索引列
|
2021
2003
|
'transaction_mode': 'batch', # 事务模式
|
2022
|
-
'unique_keys': [['日期', '店铺名称', '产品线', '触发sku_id', '跟单sku_id']], # 唯一约束列表
|
2004
|
+
'unique_keys': [['日期', '店铺名称', '产品线', '触发sku_id', '跟单sku_id', '花费']], # 唯一约束列表
|
2023
2005
|
}
|
2024
2006
|
|
2025
2007
|
@try_except
|
@@ -3761,12 +3743,7 @@ def date_table():
|
|
3761
3743
|
}
|
3762
3744
|
|
3763
3745
|
|
3764
|
-
def query1(months=1,
|
3765
|
-
if less_dict is None:
|
3766
|
-
less_dict = []
|
3767
|
-
if months == 0:
|
3768
|
-
logger.info('months 不建议为 0')
|
3769
|
-
return
|
3746
|
+
def query1(months=1, download_manager=None):
|
3770
3747
|
sdq = MysqlDatasQuery(download_manager=download_manager) # 实例化数据处理类
|
3771
3748
|
sdq.months = months # 设置数据周期, 1 表示近 2 个月
|
3772
3749
|
|
@@ -3793,12 +3770,7 @@ def query1(months=1, less_dict=None, download_manager=None):
|
|
3793
3770
|
sdq.performance_concat(bb_tg=False, db_name='聚合数据', table_name='天猫_推广汇总') # _推广商品销售
|
3794
3771
|
|
3795
3772
|
|
3796
|
-
def query2(months=1,
|
3797
|
-
if less_dict is None:
|
3798
|
-
less_dict = []
|
3799
|
-
if months == 0:
|
3800
|
-
logger.info('months 不建议为 0')
|
3801
|
-
return
|
3773
|
+
def query2(months=1, download_manager=None):
|
3802
3774
|
sdq = MysqlDatasQuery(download_manager=download_manager) # 实例化数据处理类
|
3803
3775
|
sdq.months = months # 设置数据周期, 1 表示近 2 个月
|
3804
3776
|
sdq.dplyd(db_name='聚合数据', table_name='店铺流量来源构成')
|
@@ -3811,18 +3783,13 @@ def query2(months=1, less_dict=None, download_manager=None):
|
|
3811
3783
|
sdq.deeplink(db_name='聚合数据', table_name='达摩盘_deeplink人群洞察')
|
3812
3784
|
|
3813
3785
|
|
3814
|
-
def query3(months=1,
|
3815
|
-
if less_dict is None:
|
3816
|
-
less_dict = []
|
3817
|
-
if months == 0:
|
3818
|
-
logger.info('months 不建议为 0')
|
3819
|
-
return
|
3786
|
+
def query3(months=1, download_manager=None):
|
3820
3787
|
sdq = MysqlDatasQuery(download_manager=download_manager) # 实例化数据处理类
|
3821
3788
|
sdq.months = months # 设置数据周期, 1 表示近 2 个月
|
3822
3789
|
sdq.spph(db_name='聚合数据', table_name='天猫_商品排行')
|
3823
3790
|
|
3824
3791
|
|
3825
|
-
def main(
|
3792
|
+
def main(months=3):
|
3826
3793
|
# 1. 更新日期表 更新货品年份基准表, 属性设置 3 - 货品年份基准
|
3827
3794
|
date_table()
|
3828
3795
|
|
mdbq/mysql/uploader.py
CHANGED
@@ -528,7 +528,6 @@ class MySQLUploader:
|
|
528
528
|
})
|
529
529
|
return 0.0
|
530
530
|
elif 'date' in column_type_lower or 'time' in column_type_lower:
|
531
|
-
# 判断是date还是datetime/timestamp
|
532
531
|
if 'datetime' in column_type_lower or 'timestamp' in column_type_lower:
|
533
532
|
default_date = '2000-01-01 00:00:00'
|
534
533
|
else:
|
@@ -545,14 +544,14 @@ class MySQLUploader:
|
|
545
544
|
return None
|
546
545
|
try:
|
547
546
|
if isinstance(value, str) and value.strip().endswith('%'):
|
548
|
-
|
547
|
+
if re.match(r'^\d+(\.\d+)?%$', value.strip()):
|
549
548
|
percent_str = value.strip().replace('%', '')
|
550
549
|
percent_value = float(percent_str)
|
551
550
|
decimal_value = percent_value / 100
|
552
551
|
logger.debug('百分比字符串转小数', {'原始': value, '结果': decimal_value})
|
553
552
|
return decimal_value
|
554
|
-
|
555
|
-
logger.warning('
|
553
|
+
else:
|
554
|
+
logger.warning('百分比字符串不符合格式,跳过转换', {
|
556
555
|
'库': db_name, '表': table_name, '列': col_name, '原始': value
|
557
556
|
})
|
558
557
|
elif 'int' in column_type_lower:
|
@@ -582,10 +581,18 @@ class MySQLUploader:
|
|
582
581
|
})
|
583
582
|
raise ValueError(f"无效日期格式: `{value}` -> {str(e)}")
|
584
583
|
return str(value)
|
585
|
-
elif '
|
584
|
+
elif 'varchar' in column_type_lower:
|
586
585
|
if isinstance(value, str):
|
587
586
|
return value.replace('\\', '\\\\').replace("'", "\\'")
|
588
|
-
|
587
|
+
elif 'text' in column_type_lower:
|
588
|
+
if isinstance(value, str):
|
589
|
+
max_length = 65535
|
590
|
+
if len(value) > max_length:
|
591
|
+
logger.warning(f'TEXT字符串长度不允许超过 {max_length},已截断', {
|
592
|
+
'库': db_name, '表': table_name, '列': col_name, '原始值': f'{value[:50]}...', '截断后值': f'{value[:50]}...'
|
593
|
+
})
|
594
|
+
value = value[:max_length]
|
595
|
+
return value.replace('\\', '\\\\').replace("'", "\\'")
|
589
596
|
elif 'json' in column_type_lower:
|
590
597
|
return json.dumps(value) if value is not None else None
|
591
598
|
else:
|
@@ -1,7 +1,7 @@
|
|
1
1
|
mdbq/__init__.py,sha256=Il5Q9ATdX8yXqVxtP_nYqUhExzxPC_qk_WXQ_4h0exg,16
|
2
|
-
mdbq/__version__.py,sha256=
|
2
|
+
mdbq/__version__.py,sha256=K0JdqT-aY_eW77ySyyxnpc599EoZ9CKOLZg_w5AvAnM,17
|
3
3
|
mdbq/aggregation/__init__.py,sha256=EeDqX2Aml6SPx8363J-v1lz0EcZtgwIBYyCJV6CcEDU,40
|
4
|
-
mdbq/aggregation/query_data.py,sha256=
|
4
|
+
mdbq/aggregation/query_data.py,sha256=3GBdX0HWKvQ-B3NiZE_hzWbJ7sqClzCd8KTvXpVPnZ4,170452
|
5
5
|
mdbq/config/__init__.py,sha256=jso1oHcy6cJEfa7udS_9uO5X6kZLoPBF8l3wCYmr5dM,18
|
6
6
|
mdbq/config/config.py,sha256=eaTfrfXQ65xLqjr5I8-HkZd_jEY1JkGinEgv3TSLeoQ,3170
|
7
7
|
mdbq/log/__init__.py,sha256=Mpbrav0s0ifLL7lVDAuePEi1hJKiSHhxcv1byBKDl5E,15
|
@@ -12,7 +12,7 @@ mdbq/mysql/deduplicator.py,sha256=8v3MC6TJ0YEiExWrTP9OXAxTYnL9XbpYL2vWaER1h2M,73
|
|
12
12
|
mdbq/mysql/mysql.py,sha256=pDg771xBugCMSTWeskIFTi3pFLgaqgyG3smzf-86Wn8,56772
|
13
13
|
mdbq/mysql/s_query.py,sha256=RnVCwMQ_n9PcAimbMWbHe9k8eil8shtCfa3LwLBZi6c,41909
|
14
14
|
mdbq/mysql/unique_.py,sha256=Wgqq_PjAAD757JTa10wjYaJgssZ_C_ypU6DW56jbuyw,21074
|
15
|
-
mdbq/mysql/uploader.py,sha256=
|
15
|
+
mdbq/mysql/uploader.py,sha256=bYE_VGTeEigpRFYvZ9Ob3A9vxq21NuOdrXFkv8Bm_p8,74919
|
16
16
|
mdbq/other/__init__.py,sha256=jso1oHcy6cJEfa7udS_9uO5X6kZLoPBF8l3wCYmr5dM,18
|
17
17
|
mdbq/other/download_sku_picture.py,sha256=YU8DxKMXbdeE1OOKEA848WVp62jYHw5O4tXTjUdq9H0,44832
|
18
18
|
mdbq/other/otk.py,sha256=iclBIFbQbhlqzUbcMMoePXBpcP1eZ06ZtjnhcA_EbmE,7241
|
@@ -25,7 +25,7 @@ mdbq/redis/__init__.py,sha256=YtgBlVSMDphtpwYX248wGge1x-Ex_mMufz4-8W0XRmA,12
|
|
25
25
|
mdbq/redis/getredis.py,sha256=l3zBK7wrZl0oO42-_UGylyatnIp_SBw8wDDvof9fht4,23534
|
26
26
|
mdbq/spider/__init__.py,sha256=RBMFXGy_jd1HXZhngB2T2XTvJqki8P_Fr-pBcwijnew,18
|
27
27
|
mdbq/spider/aikucun.py,sha256=hPRzLQvFIF4ibN8aP3Dg_ru5meac90faPyzOB22cj-o,20965
|
28
|
-
mdbq-4.0.
|
29
|
-
mdbq-4.0.
|
30
|
-
mdbq-4.0.
|
31
|
-
mdbq-4.0.
|
28
|
+
mdbq-4.0.5.dist-info/METADATA,sha256=boklJ7iCN4Uh-Czst1DiQlPrKKSawDIYknmipAd9w5A,363
|
29
|
+
mdbq-4.0.5.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
|
30
|
+
mdbq-4.0.5.dist-info/top_level.txt,sha256=2FQ-uLnCSB-OwFiWntzmwosW3X2Xqsg0ewh1axsaylA,5
|
31
|
+
mdbq-4.0.5.dist-info/RECORD,,
|
File without changes
|
File without changes
|