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 CHANGED
@@ -1 +1 @@
1
- VERSION = '4.0.32'
1
+ VERSION = '4.0.34'
@@ -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
- logger.info('更新', {'库': db_name, '表': table_name, 'func': func.__name__, 'args': args, 'kwargs': kwargs})
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.tg_wxt(db_name='聚合数据', table_name='天猫_主体报表')
3787
+ sdq.global_insights(db_name='聚合数据', table_name='全域洞察')
@@ -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
- # deduplicator.deduplicate_table(
1394
- # '达摩盘3',
1395
- # '货品洞察_全店单品_2024_11',
1396
- # columns=['日期', '店铺名称', '数据周期', '商品id'],
1397
- # dry_run=False,
1398
- # reorder_id=True,
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], date_field: Optional[str] = None) -> Optional[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
- date_field: 用户指定的日期字段名
607
+ date_column: 用户指定的日期字段名
608
608
 
609
609
  Returns:
610
610
  有效的日期字段名,如果未找到则返回None
611
611
  """
612
- if date_field:
613
- if date_field not in cols_exist:
612
+ if date_column:
613
+ if date_column not in cols_exist:
614
614
  logger.debug('指定的日期字段不存在', {
615
- '指定的日期字段': date_field,
615
+ '指定的日期字段': date_column,
616
616
  '可用的列': list(cols_exist)
617
617
  })
618
618
  return None
619
- logger.debug('使用指定的日期字段', {'日期字段': date_field})
620
- return date_field
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[Dict[str, int]] = None) -> List[str]:
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: 列筛选字典,key为列名,value为1表示选中
645
- - 如果为None、空字典{}或空列表[],则返回所有列
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
- if projection is None or projection == {} or projection == []:
655
- return list(cols_exist)
656
- invalid_chars = set('`\'"\\')
657
- selected_columns = []
658
- for col in projection:
659
- if any(char in col for char in invalid_chars):
660
- logger.warning('列名包含特殊字符,已跳过', {'列名': col})
661
- continue
662
- if col in cols_exist and projection[col]:
663
- selected_columns.append(col)
664
- if not selected_columns:
665
- logger.info('参数不匹配,返回所有列', {'参数': projection})
666
- return list(cols_exist)
667
- return selected_columns
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
- date_field: Optional[str] = None, start_date: Optional[str] = None,
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
- date_field: 日期字段名
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 date_field:
737
+ if date_column:
711
738
  conditions = []
712
739
  if start_date is not None:
713
- conditions.append(f"`{date_field}` >= %s")
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"`{date_field}` <= %s")
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
- date_field: Optional[str] = None,
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
- - 值为1表示选中该列,0表示不选中该列
816
- - 例如:{'日期': 1, '场景名字': 1} 表示只查询这两列
817
- - 如果为None、空字典{}或空列表[],则查询所有列
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
- date_field: 日期字段名,如果为None则使用默认的"日期"字段
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 date_field is None:
863
- date_field = "日期"
890
+ if date_column is None:
891
+ date_column = "日期"
864
892
 
865
893
  # 检查指定的日期字段是否存在
866
- if date_field not in cols_exist:
894
+ if date_column not in cols_exist:
867
895
  logger.warning('指定的日期字段不存在,将返回所有数据', {
868
896
  '库': db_name,
869
897
  '表': table_name,
870
- '指定日期字段': date_field
898
+ '指定日期字段': date_column
871
899
  })
872
900
  start_date = None
873
901
  end_date = None
874
- date_field = None
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
- date_field, start_date, end_date, None
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
- '日期字段': date_field,
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
- '日期字段': date_field,
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 or 'text' 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
- return f"`{self._normalize_col(col)}`"
446
+ else:
447
+ return f"`{self._normalize_col(col)}`"
439
448
 
440
449
  # 处理主键
441
450
  if primary_keys and len(primary_keys) > 0:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: mdbq
3
- Version: 4.0.32
3
+ Version: 4.0.34
4
4
  Home-page: https://pypi.org/project/mdbq
5
5
  Author: xigua,
6
6
  Author-email: 2587125111@qq.com
@@ -1,17 +1,17 @@
1
1
  mdbq/__init__.py,sha256=Il5Q9ATdX8yXqVxtP_nYqUhExzxPC_qk_WXQ_4h0exg,16
2
- mdbq/__version__.py,sha256=JlP9c4CD0Z8Ewghucau-8dDN36XOz-Fzk6Lsmjua5AY,18
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=JrIoYIQpwFETAZ_KG7RKSO4aoLcegHwKT8kiktChOdk,164705
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=YgOUkjLEm8DmH_p-du-MTnR3gTFztjUoaY3b-QklnR4,73077
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=hQpoZ868hxDQpZ-im5Kmmixdh0Khkzj-MrVxkUTU3Kg,44984
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=_c_8t5Cx2qbtyOLtii2Gv7vpTlpawWjrB_9zBz1MaC4,81507
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.32.dist-info/METADATA,sha256=PILyHn6uBC6wAxIFcw6M_xwrLb8t4n3Htvbj33vGjsI,364
28
- mdbq-4.0.32.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
29
- mdbq-4.0.32.dist-info/top_level.txt,sha256=2FQ-uLnCSB-OwFiWntzmwosW3X2Xqsg0ewh1axsaylA,5
30
- mdbq-4.0.32.dist-info/RECORD,,
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