mdbq 4.0.32__py3-none-any.whl → 4.0.34__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 +94 -2
- mdbq/mysql/deduplicator.py +10 -10
- mdbq/mysql/s_query.py +76 -48
- mdbq/mysql/uploader.py +11 -2
- {mdbq-4.0.32.dist-info → mdbq-4.0.34.dist-info}/METADATA +1 -1
- {mdbq-4.0.32.dist-info → mdbq-4.0.34.dist-info}/RECORD +9 -9
- {mdbq-4.0.32.dist-info → mdbq-4.0.34.dist-info}/WHEEL +0 -0
- {mdbq-4.0.32.dist-info → mdbq-4.0.34.dist-info}/top_level.txt +0 -0
mdbq/__version__.py
CHANGED
@@ -1 +1 @@
|
|
1
|
-
VERSION = '4.0.
|
1
|
+
VERSION = '4.0.34'
|
mdbq/aggregation/query_data.py
CHANGED
@@ -113,7 +113,22 @@ def upload_data_decorator(**upload_kwargs):
|
|
113
113
|
set_type = get_param_value('set_type', ['set_type', 'set_typ'])
|
114
114
|
db_name = get_param_value('db_name')
|
115
115
|
table_name = get_param_value('table_name')
|
116
|
-
|
116
|
+
# 参数摘要处理
|
117
|
+
def summarize_value(val):
|
118
|
+
if isinstance(val, pd.DataFrame):
|
119
|
+
return f"DataFrame(shape={val.shape}, columns={list(val.columns)})"
|
120
|
+
elif isinstance(val, np.ndarray):
|
121
|
+
return f"ndarray(shape={val.shape}, dtype={val.dtype})"
|
122
|
+
elif isinstance(val, (list, tuple)):
|
123
|
+
return [summarize_value(v) for v in val]
|
124
|
+
elif isinstance(val, dict):
|
125
|
+
return {k: summarize_value(v) for k, v in val.items()}
|
126
|
+
elif hasattr(val, '__class__') and not isinstance(val, (str, int, float, bool, type(None))):
|
127
|
+
return f"{val.__class__.__name__}"
|
128
|
+
else:
|
129
|
+
return val
|
130
|
+
args_summary = {k: summarize_value(v) for k, v in args_dict.items()}
|
131
|
+
logger.info('更新', {'库': db_name, '表': table_name, 'func': func.__name__, 'args': args_summary, 'kwargs': kwargs})
|
117
132
|
|
118
133
|
# 执行原始函数
|
119
134
|
result = func(*args, **kwargs)
|
@@ -3018,6 +3033,82 @@ class MysqlDatasQuery:
|
|
3018
3033
|
'unique_keys': [['日期', '人群类型', '店铺名称', '人群规模']], # 唯一约束列表
|
3019
3034
|
}
|
3020
3035
|
|
3036
|
+
@upload_data_decorator()
|
3037
|
+
def global_insights(self, db_name='聚合数据', table_name='全域洞察'):
|
3038
|
+
start_date, end_date = self.months_data(num=self.months)
|
3039
|
+
exclude_projection = ['日期', '结束日期', '在投计划数', 'bizcode', 'channeltype', 'urlonebp', '渠道策略']
|
3040
|
+
__res = []
|
3041
|
+
for year in range(2025, datetime.datetime.today().year + 1):
|
3042
|
+
df_global = self.download_manager.data_to_df(
|
3043
|
+
db_name='达摩盘3',
|
3044
|
+
table_name=f'全域洞察_{year}',
|
3045
|
+
start_date=start_date,
|
3046
|
+
end_date=end_date,
|
3047
|
+
projection={},
|
3048
|
+
exclude_projection=exclude_projection,
|
3049
|
+
date_column='起始日期',
|
3050
|
+
)
|
3051
|
+
__res.append(df_global)
|
3052
|
+
df = pd.concat(__res, ignore_index=True)
|
3053
|
+
if len(df) == 0:
|
3054
|
+
return None, None
|
3055
|
+
df.rename(columns={'起始日期': '日期'}, inplace=True)
|
3056
|
+
|
3057
|
+
# df.drop_duplicates(subset=['日期', '店铺名称', '场景id', '父渠道id'], keep='last', inplace=True, ignore_index=True)
|
3058
|
+
set_typ = {
|
3059
|
+
'日期': 'date',
|
3060
|
+
'起始日期': 'date',
|
3061
|
+
'结束日期': 'date',
|
3062
|
+
'店铺名称': 'varchar(100)',
|
3063
|
+
'场景id': 'varchar(50)',
|
3064
|
+
'场景名字': 'varchar(50)',
|
3065
|
+
'是否子渠道': 'varchar(10)',
|
3066
|
+
'父渠道id': 'varchar(50)',
|
3067
|
+
'父渠道名称': 'varchar(50)',
|
3068
|
+
'在投计划数': 'varchar(10)',
|
3069
|
+
'bizCode': 'varchar(50)',
|
3070
|
+
'channelType': 'varchar(50)',
|
3071
|
+
'urlOneBP': 'varchar(255)',
|
3072
|
+
'花费': 'decimal(12, 2)',
|
3073
|
+
'展现量': 'int',
|
3074
|
+
'点击量': 'int',
|
3075
|
+
'加购成本': 'decimal(10, 4)',
|
3076
|
+
'加购率': 'decimal(10, 4)',
|
3077
|
+
'单次点击成本': 'decimal(10, 4)',
|
3078
|
+
'当天引导roi': 'decimal(10, 4)',
|
3079
|
+
'当天引导成交笔数': 'int',
|
3080
|
+
'当天引导成交金额': 'decimal(12, 2)',
|
3081
|
+
'总购物车数': 'int',
|
3082
|
+
'成交笔数': 'int',
|
3083
|
+
'成交转化率': 'decimal(10, 4)',
|
3084
|
+
'成交金额': 'decimal(12, 2)',
|
3085
|
+
'成交金额占比': 'decimal(10, 4)',
|
3086
|
+
'消耗占比': 'decimal(10, 4)',
|
3087
|
+
'渠道策略': 'varchar(255)',
|
3088
|
+
'点击转化率': 'decimal(10, 6)',
|
3089
|
+
'种草': 'varchar(10)',
|
3090
|
+
'笔单价': 'decimal(10, 2)',
|
3091
|
+
'蓄水转化成交笔数': 'int',
|
3092
|
+
'蓄水转化成交金额': 'decimal(12, 2)',
|
3093
|
+
'转化收割': 'varchar(10)',
|
3094
|
+
'更新时间': 'timestamp',
|
3095
|
+
}
|
3096
|
+
return df, {
|
3097
|
+
'db_name': db_name,
|
3098
|
+
'table_name': table_name,
|
3099
|
+
'set_typ': set_typ,
|
3100
|
+
'primary_keys': [], # 创建唯一主键
|
3101
|
+
'check_duplicate': False, # 检查重复数据
|
3102
|
+
'duplicate_columns': [], # 指定排重的组合键
|
3103
|
+
'update_on_duplicate': True, # 更新旧数据
|
3104
|
+
'allow_null': False, # 允许插入空值
|
3105
|
+
'partition_by': None, # 分表方式
|
3106
|
+
'partition_date_column': '日期', # 用于分表的日期列名,默认为'日期'
|
3107
|
+
'indexes': [], # 普通索引列
|
3108
|
+
'transaction_mode': 'batch', # 事务模式
|
3109
|
+
'unique_keys': [['日期', '店铺名称', '场景id', '父渠道id']], # 唯一约束列表
|
3110
|
+
}
|
3111
|
+
|
3021
3112
|
# @try_except
|
3022
3113
|
@upload_data_decorator()
|
3023
3114
|
def dmp_crowd(self, db_name='聚合数据', table_name='达摩盘_人群报表'):
|
@@ -3649,6 +3740,7 @@ def query2(months=1, download_manager=None):
|
|
3649
3740
|
sdq.aikucun_bd_spu(db_name='聚合数据', table_name='爱库存_商品spu榜单')
|
3650
3741
|
sdq.dmp_crowd(db_name='聚合数据', table_name='达摩盘_人群报表')
|
3651
3742
|
sdq.deeplink(db_name='聚合数据', table_name='达摩盘_deeplink人群洞察')
|
3743
|
+
sdq.global_insights(db_name='聚合数据', table_name='全域洞察')
|
3652
3744
|
|
3653
3745
|
|
3654
3746
|
def query3(months=1, download_manager=None):
|
@@ -3692,4 +3784,4 @@ if __name__ == '__main__':
|
|
3692
3784
|
)
|
3693
3785
|
sdq = MysqlDatasQuery(download_manager=download_manager)
|
3694
3786
|
sdq.months = 3
|
3695
|
-
sdq.
|
3787
|
+
sdq.global_insights(db_name='聚合数据', table_name='全域洞察')
|
mdbq/mysql/deduplicator.py
CHANGED
@@ -1352,7 +1352,7 @@ def main():
|
|
1352
1352
|
section='mysql',
|
1353
1353
|
keys=['host', 'port', 'username', 'password'],
|
1354
1354
|
)
|
1355
|
-
host = 'localhost'
|
1355
|
+
# host = 'localhost'
|
1356
1356
|
|
1357
1357
|
deduplicator = MySQLDeduplicator(
|
1358
1358
|
username=username,
|
@@ -1367,7 +1367,7 @@ def main():
|
|
1367
1367
|
pool_size=20,
|
1368
1368
|
mincached=5,
|
1369
1369
|
maxcached=10,
|
1370
|
-
recent_month=1,
|
1370
|
+
# recent_month=1,
|
1371
1371
|
# date_range=['2025-06-09', '2025-06-10'],
|
1372
1372
|
exclude_columns=['更新时间'],
|
1373
1373
|
exclude_databases=['cookie文件', '日志', '视频数据', '云电影'],
|
@@ -1384,19 +1384,19 @@ def main():
|
|
1384
1384
|
)
|
1385
1385
|
|
1386
1386
|
# 全库去重(单线程)
|
1387
|
-
deduplicator.deduplicate_all(dry_run=False, parallel=True, reorder_id=True)
|
1387
|
+
# deduplicator.deduplicate_all(dry_run=False, parallel=True, reorder_id=True)
|
1388
1388
|
|
1389
1389
|
# # 指定数据库去重(多线程)
|
1390
1390
|
# deduplicator.deduplicate_database('数据引擎2', dry_run=False, parallel=True, reorder_id=True)
|
1391
1391
|
|
1392
1392
|
# # 指定表去重(使用特定列)
|
1393
|
-
|
1394
|
-
|
1395
|
-
|
1396
|
-
|
1397
|
-
|
1398
|
-
|
1399
|
-
|
1393
|
+
deduplicator.deduplicate_table(
|
1394
|
+
'生意参谋3',
|
1395
|
+
'新品追踪_旧接口_2025',
|
1396
|
+
columns=['商品id', '累计商品浏览量', '累计商品访客数'],
|
1397
|
+
dry_run=False,
|
1398
|
+
reorder_id=True,
|
1399
|
+
)
|
1400
1400
|
|
1401
1401
|
# # 重排id列
|
1402
1402
|
# deduplicator.reorder_id_column('my_db', 'my_table', 'id', dry_run=False, auto_drop_backup=True)
|
mdbq/mysql/s_query.py
CHANGED
@@ -598,26 +598,26 @@ class QueryDatas:
|
|
598
598
|
})
|
599
599
|
return None, None
|
600
600
|
|
601
|
-
def _detect_date_field(self, cols_exist: Set[str],
|
601
|
+
def _detect_date_field(self, cols_exist: Set[str], date_column: Optional[str] = None) -> Optional[str]:
|
602
602
|
"""
|
603
603
|
检测或验证日期字段。
|
604
604
|
|
605
605
|
Args:
|
606
606
|
cols_exist: 存在的列名集合
|
607
|
-
|
607
|
+
date_column: 用户指定的日期字段名
|
608
608
|
|
609
609
|
Returns:
|
610
610
|
有效的日期字段名,如果未找到则返回None
|
611
611
|
"""
|
612
|
-
if
|
613
|
-
if
|
612
|
+
if date_column:
|
613
|
+
if date_column not in cols_exist:
|
614
614
|
logger.debug('指定的日期字段不存在', {
|
615
|
-
'指定的日期字段':
|
615
|
+
'指定的日期字段': date_column,
|
616
616
|
'可用的列': list(cols_exist)
|
617
617
|
})
|
618
618
|
return None
|
619
|
-
logger.debug('使用指定的日期字段', {'日期字段':
|
620
|
-
return
|
619
|
+
logger.debug('使用指定的日期字段', {'日期字段': date_column})
|
620
|
+
return date_column
|
621
621
|
|
622
622
|
# 自动检测可能的日期字段
|
623
623
|
possible_date_fields = {'日期', 'date', 'create_time', 'update_time', 'created_at', 'updated_at', '更新时间', '创建时间'}
|
@@ -635,39 +635,66 @@ class QueryDatas:
|
|
635
635
|
})
|
636
636
|
return detected_field
|
637
637
|
|
638
|
-
def _get_selected_columns(self, cols_exist: Set[str], projection: Optional[
|
638
|
+
def _get_selected_columns(self, cols_exist: Set[str], projection: Optional[Any] = None, exclude_projection: Optional[list] = None) -> List[str]:
|
639
639
|
"""
|
640
640
|
获取要查询的列名列表。
|
641
641
|
|
642
642
|
Args:
|
643
643
|
cols_exist: 存在的列名集合
|
644
|
-
projection:
|
645
|
-
|
646
|
-
- 如果为字典,则根据value值筛选列
|
647
|
-
|
644
|
+
projection: 列筛选字典或列表,优先级高于exclude_projection
|
645
|
+
exclude_projection: 反选列名列表,排除这些列,选取所有其他列
|
648
646
|
Returns:
|
649
647
|
选中的列名列表
|
650
648
|
"""
|
651
649
|
if not cols_exist:
|
652
650
|
logger.warning('表没有可用列')
|
653
651
|
return []
|
654
|
-
|
655
|
-
|
656
|
-
|
657
|
-
|
658
|
-
|
659
|
-
|
660
|
-
|
661
|
-
|
662
|
-
|
663
|
-
|
664
|
-
|
665
|
-
|
666
|
-
|
667
|
-
|
652
|
+
# projection优先
|
653
|
+
if projection is not None and projection != {} and projection != []:
|
654
|
+
invalid_chars = set('`\'"\\')
|
655
|
+
selected_columns = []
|
656
|
+
if isinstance(projection, list):
|
657
|
+
for col in projection:
|
658
|
+
if any(char in col for char in invalid_chars):
|
659
|
+
logger.warning('列名包含特殊字符,已跳过', {'列名': col})
|
660
|
+
continue
|
661
|
+
if col in cols_exist:
|
662
|
+
selected_columns.append(col)
|
663
|
+
if not selected_columns:
|
664
|
+
logger.info('参数不匹配,返回所有列', {'参数': projection})
|
665
|
+
return list(cols_exist)
|
666
|
+
return selected_columns
|
667
|
+
# 字典格式
|
668
|
+
for col in projection:
|
669
|
+
if any(char in col for char in invalid_chars):
|
670
|
+
logger.warning('列名包含特殊字符,已跳过', {'列名': col})
|
671
|
+
continue
|
672
|
+
if col in cols_exist and projection[col]:
|
673
|
+
selected_columns.append(col)
|
674
|
+
if not selected_columns:
|
675
|
+
logger.info('参数不匹配,返回所有列', {'参数': projection})
|
676
|
+
return list(cols_exist)
|
677
|
+
return selected_columns
|
678
|
+
# 反选逻辑
|
679
|
+
if exclude_projection is not None and exclude_projection != []:
|
680
|
+
invalid_chars = set('`\'"\\')
|
681
|
+
exclude_set = set()
|
682
|
+
for col in exclude_projection:
|
683
|
+
if any(char in col for char in invalid_chars):
|
684
|
+
logger.warning('反选列名包含特殊字符,已跳过', {'列名': col})
|
685
|
+
continue
|
686
|
+
if col in cols_exist:
|
687
|
+
exclude_set.add(col)
|
688
|
+
selected_columns = [col for col in cols_exist if col not in exclude_set]
|
689
|
+
if not selected_columns:
|
690
|
+
logger.info('反选后无可用字段,返回所有列', {'反选参数': exclude_projection})
|
691
|
+
return list(cols_exist)
|
692
|
+
return selected_columns
|
693
|
+
# 默认全选
|
694
|
+
return list(cols_exist)
|
668
695
|
|
669
696
|
def _build_query_sql(self, db_name: str, table_name: str, selected_columns: List[str],
|
670
|
-
|
697
|
+
date_column: Optional[str] = None, start_date: Optional[str] = None,
|
671
698
|
end_date: Optional[str] = None, limit: Optional[int] = None) -> Tuple[str, List[Any]]:
|
672
699
|
"""
|
673
700
|
构建SQL查询语句和参数。
|
@@ -676,7 +703,7 @@ class QueryDatas:
|
|
676
703
|
db_name: 数据库名
|
677
704
|
table_name: 表名
|
678
705
|
selected_columns: 选中的列名列表
|
679
|
-
|
706
|
+
date_column: 日期字段名
|
680
707
|
start_date: 开始日期
|
681
708
|
end_date: 结束日期
|
682
709
|
limit: 限制返回行数,None表示不限制
|
@@ -707,14 +734,14 @@ class QueryDatas:
|
|
707
734
|
param_names = [] # 用于记录参数名称
|
708
735
|
|
709
736
|
# 如果有日期字段,添加日期过滤条件
|
710
|
-
if
|
737
|
+
if date_column:
|
711
738
|
conditions = []
|
712
739
|
if start_date is not None:
|
713
|
-
conditions.append(f"`{
|
740
|
+
conditions.append(f"`{date_column}` >= %s")
|
714
741
|
params.append(start_date)
|
715
742
|
param_names.append('开始日期')
|
716
743
|
if end_date is not None:
|
717
|
-
conditions.append(f"`{
|
744
|
+
conditions.append(f"`{date_column}` <= %s")
|
718
745
|
params.append(end_date)
|
719
746
|
param_names.append('结束日期')
|
720
747
|
|
@@ -793,10 +820,11 @@ class QueryDatas:
|
|
793
820
|
table_name: str,
|
794
821
|
start_date: Optional[str] = None,
|
795
822
|
end_date: Optional[str] = None,
|
796
|
-
projection: Optional[Dict[str, int]] = None,
|
823
|
+
projection: Optional[Dict[str, int]] = None,
|
824
|
+
exclude_projection: Optional[list] = None,
|
797
825
|
limit: Optional[int] = None,
|
798
826
|
page_size: Optional[int] = None,
|
799
|
-
|
827
|
+
date_column: Optional[str] = None,
|
800
828
|
return_format: Literal['df', 'list_dict'] = 'df'
|
801
829
|
) -> Union[pd.DataFrame, List[Dict[str, Any]]]:
|
802
830
|
"""
|
@@ -810,14 +838,14 @@ class QueryDatas:
|
|
810
838
|
table_name: 表名
|
811
839
|
start_date: 起始日期(包含),支持多种日期格式,如'YYYY-MM-DD'、'YYYY/MM/DD'等
|
812
840
|
end_date: 结束日期(包含),支持多种日期格式,如'YYYY-MM-DD'、'YYYY/MM/DD'等
|
813
|
-
projection:
|
814
|
-
-
|
815
|
-
-
|
816
|
-
-
|
817
|
-
|
841
|
+
projection: 列筛选字典或列表,用于指定要查询的列,优先级高于exclude_projection
|
842
|
+
- 字典格式:{'列名1': 1, '列名2': 0} 键为列名(字符串),值为1表示选中该列,0表示不选中该列
|
843
|
+
- 列表格式:['列名1', '列名2'] 只查询指定列
|
844
|
+
- 如果为None、空字典{}或空列表[],则查询所有列(除非设置了exclude_projection)
|
845
|
+
exclude_projection: 反选列名列表,排除这些列,选取所有其他列。与projection互斥,projection优先。
|
818
846
|
limit: 限制返回的最大行数,None表示不限制
|
819
847
|
page_size: 分页查询时每页的数据量,None表示不使用分页
|
820
|
-
|
848
|
+
date_column: 日期字段名,如果为None则使用默认的"日期"字段
|
821
849
|
return_format: 返回数据格式
|
822
850
|
- 'df': 返回pandas DataFrame(默认)
|
823
851
|
- 'list_dict': 返回列表字典格式 [{列1:值, 列2:值, ...}, ...]
|
@@ -859,22 +887,22 @@ class QueryDatas:
|
|
859
887
|
# 设置日期字段
|
860
888
|
if start_date is not None and end_date is not None:
|
861
889
|
# 如果未指定日期字段,使用默认的"日期"字段
|
862
|
-
if
|
863
|
-
|
890
|
+
if date_column is None:
|
891
|
+
date_column = "日期"
|
864
892
|
|
865
893
|
# 检查指定的日期字段是否存在
|
866
|
-
if
|
894
|
+
if date_column not in cols_exist:
|
867
895
|
logger.warning('指定的日期字段不存在,将返回所有数据', {
|
868
896
|
'库': db_name,
|
869
897
|
'表': table_name,
|
870
|
-
'指定日期字段':
|
898
|
+
'指定日期字段': date_column
|
871
899
|
})
|
872
900
|
start_date = None
|
873
901
|
end_date = None
|
874
|
-
|
902
|
+
date_column = None
|
875
903
|
|
876
904
|
# 获取选中的列
|
877
|
-
selected_columns = self._get_selected_columns(cols_exist, projection)
|
905
|
+
selected_columns = self._get_selected_columns(cols_exist, projection, exclude_projection)
|
878
906
|
if not selected_columns:
|
879
907
|
logger.info('未找到可用字段', {'库': db_name, '表': table_name, '字段': selected_columns})
|
880
908
|
return [] if return_format == 'list_dict' else pd.DataFrame()
|
@@ -882,7 +910,7 @@ class QueryDatas:
|
|
882
910
|
# 构建基础SQL
|
883
911
|
base_sql, params, param_names = self._build_query_sql(
|
884
912
|
db_name, table_name, selected_columns,
|
885
|
-
|
913
|
+
date_column, start_date, end_date, None
|
886
914
|
)
|
887
915
|
|
888
916
|
# 如果指定了limit且没有指定page_size,使用简单查询
|
@@ -963,7 +991,7 @@ class QueryDatas:
|
|
963
991
|
'查询参数': {
|
964
992
|
'开始日期': start_date,
|
965
993
|
'结束日期': end_date,
|
966
|
-
'日期字段':
|
994
|
+
'日期字段': date_column,
|
967
995
|
'限制行数': limit,
|
968
996
|
'分页大小': page_size,
|
969
997
|
'返回数据格式': return_format,
|
@@ -980,7 +1008,7 @@ class QueryDatas:
|
|
980
1008
|
'查询参数': {
|
981
1009
|
'开始日期': start_date,
|
982
1010
|
'结束日期': end_date,
|
983
|
-
'日期字段':
|
1011
|
+
'日期字段': date_column,
|
984
1012
|
'限制行数': limit,
|
985
1013
|
'分页大小': page_size,
|
986
1014
|
'返回数据格式': return_format,
|
mdbq/mysql/uploader.py
CHANGED
@@ -433,9 +433,18 @@ class MySQLUploader:
|
|
433
433
|
# 主键处理逻辑调整
|
434
434
|
def _index_col_sql(col):
|
435
435
|
col_type = set_typ.get(col, '').lower()
|
436
|
-
if 'varchar' in col_type
|
436
|
+
if 'varchar' in col_type:
|
437
|
+
m = re.search(r'varchar\((\d+)\)', col_type)
|
438
|
+
if m:
|
439
|
+
maxlen = int(m.group(1))
|
440
|
+
prefix_len = min(100, maxlen)
|
441
|
+
return f"`{self._normalize_col(col)}`({prefix_len})"
|
442
|
+
else:
|
443
|
+
return f"`{self._normalize_col(col)}`(100)"
|
444
|
+
elif 'text' in col_type:
|
437
445
|
return f"`{self._normalize_col(col)}`(100)"
|
438
|
-
|
446
|
+
else:
|
447
|
+
return f"`{self._normalize_col(col)}`"
|
439
448
|
|
440
449
|
# 处理主键
|
441
450
|
if primary_keys and len(primary_keys) > 0:
|
@@ -1,17 +1,17 @@
|
|
1
1
|
mdbq/__init__.py,sha256=Il5Q9ATdX8yXqVxtP_nYqUhExzxPC_qk_WXQ_4h0exg,16
|
2
|
-
mdbq/__version__.py,sha256=
|
2
|
+
mdbq/__version__.py,sha256=D_wa3H06nsA6Arfalq9RVMZHoFDp3ZG4xsE24b2Lu8E,18
|
3
3
|
mdbq/aggregation/__init__.py,sha256=EeDqX2Aml6SPx8363J-v1lz0EcZtgwIBYyCJV6CcEDU,40
|
4
|
-
mdbq/aggregation/query_data.py,sha256=
|
4
|
+
mdbq/aggregation/query_data.py,sha256=VICC4R0yNktmfWHItn7X0769DyRBa2hBXhJOTp3Zh2w,169282
|
5
5
|
mdbq/log/__init__.py,sha256=Mpbrav0s0ifLL7lVDAuePEi1hJKiSHhxcv1byBKDl5E,15
|
6
6
|
mdbq/log/mylogger.py,sha256=9w_o5mYB3FooIxobq_lSa6oCYTKIhPxDFox-jeLtUHI,21714
|
7
7
|
mdbq/myconf/__init__.py,sha256=jso1oHcy6cJEfa7udS_9uO5X6kZLoPBF8l3wCYmr5dM,18
|
8
8
|
mdbq/myconf/myconf.py,sha256=rHvQCnQRKhQ49AZBke-Z4v28hyOLmHt4MylIuB0H6yA,33516
|
9
9
|
mdbq/mysql/__init__.py,sha256=A_DPJyAoEvTSFojiI2e94zP0FKtCkkwKP1kYUCSyQzo,11
|
10
|
-
mdbq/mysql/deduplicator.py,sha256=
|
10
|
+
mdbq/mysql/deduplicator.py,sha256=AB3gL7ZwhcmzGHSu4UY4M6YZVPFZ2wlAN3BCcwAhegQ,73074
|
11
11
|
mdbq/mysql/mysql.py,sha256=pDg771xBugCMSTWeskIFTi3pFLgaqgyG3smzf-86Wn8,56772
|
12
|
-
mdbq/mysql/s_query.py,sha256=
|
12
|
+
mdbq/mysql/s_query.py,sha256=1wJ3HVjHEF6FA-bVeeesRlsf73CZSvVTEQ51CF1OsE4,46786
|
13
13
|
mdbq/mysql/unique_.py,sha256=MaztT-WIyEQUs-OOYY4pFulgHVcXR1BfCy3QUz0XM_U,21127
|
14
|
-
mdbq/mysql/uploader.py,sha256=
|
14
|
+
mdbq/mysql/uploader.py,sha256=SVlrLxoYBEpTu_I771wAehJQVFWOCqXp-lNk2JNYFOE,81881
|
15
15
|
mdbq/other/__init__.py,sha256=jso1oHcy6cJEfa7udS_9uO5X6kZLoPBF8l3wCYmr5dM,18
|
16
16
|
mdbq/other/download_sku_picture.py,sha256=X66sVdvVgzoNzmgVJyPtd7bjEvctEKtLPblEPF65EWc,46940
|
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=vpBuNc22uj9Vr-_Dh25_wpwWM1e-072EAAIBdB_IpL0,23494
|
25
25
|
mdbq/spider/__init__.py,sha256=RBMFXGy_jd1HXZhngB2T2XTvJqki8P_Fr-pBcwijnew,18
|
26
26
|
mdbq/spider/aikucun.py,sha256=XptHjGzbout9IYzWAOQUpMMV5qEgLTU8pL1ZGt8oNEA,21868
|
27
|
-
mdbq-4.0.
|
28
|
-
mdbq-4.0.
|
29
|
-
mdbq-4.0.
|
30
|
-
mdbq-4.0.
|
27
|
+
mdbq-4.0.34.dist-info/METADATA,sha256=m5KXyEfQlxynSXm8ht6Owk0UZ-zi8MOo2AKy9lmYODg,364
|
28
|
+
mdbq-4.0.34.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
|
29
|
+
mdbq-4.0.34.dist-info/top_level.txt,sha256=2FQ-uLnCSB-OwFiWntzmwosW3X2Xqsg0ewh1axsaylA,5
|
30
|
+
mdbq-4.0.34.dist-info/RECORD,,
|
File without changes
|
File without changes
|