mdbq 4.0.0__tar.gz → 4.0.2__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.
Files changed (36) hide show
  1. {mdbq-4.0.0 → mdbq-4.0.2}/PKG-INFO +1 -1
  2. mdbq-4.0.2/mdbq/__version__.py +1 -0
  3. {mdbq-4.0.0 → mdbq-4.0.2}/mdbq/aggregation/query_data.py +44 -72
  4. {mdbq-4.0.0 → mdbq-4.0.2}/mdbq/mysql/deduplicator.py +3 -4
  5. {mdbq-4.0.0 → mdbq-4.0.2}/mdbq/mysql/mysql.py +4 -5
  6. {mdbq-4.0.0 → mdbq-4.0.2}/mdbq/mysql/s_query.py +12 -2
  7. {mdbq-4.0.0 → mdbq-4.0.2}/mdbq/mysql/unique_.py +3 -5
  8. {mdbq-4.0.0 → mdbq-4.0.2}/mdbq/mysql/uploader.py +45 -21
  9. {mdbq-4.0.0 → mdbq-4.0.2}/mdbq/redis/getredis.py +12 -20
  10. {mdbq-4.0.0 → mdbq-4.0.2}/mdbq/spider/aikucun.py +2 -4
  11. {mdbq-4.0.0 → mdbq-4.0.2}/mdbq.egg-info/PKG-INFO +1 -1
  12. mdbq-4.0.0/mdbq/__version__.py +0 -1
  13. {mdbq-4.0.0 → mdbq-4.0.2}/README.txt +0 -0
  14. {mdbq-4.0.0 → mdbq-4.0.2}/mdbq/__init__.py +0 -0
  15. {mdbq-4.0.0 → mdbq-4.0.2}/mdbq/aggregation/__init__.py +0 -0
  16. {mdbq-4.0.0 → mdbq-4.0.2}/mdbq/config/__init__.py +0 -0
  17. {mdbq-4.0.0 → mdbq-4.0.2}/mdbq/config/config.py +0 -0
  18. {mdbq-4.0.0 → mdbq-4.0.2}/mdbq/log/__init__.py +0 -0
  19. {mdbq-4.0.0 → mdbq-4.0.2}/mdbq/log/mylogger.py +0 -0
  20. {mdbq-4.0.0 → mdbq-4.0.2}/mdbq/log/spider_logging.py +0 -0
  21. {mdbq-4.0.0 → mdbq-4.0.2}/mdbq/mysql/__init__.py +0 -0
  22. {mdbq-4.0.0 → mdbq-4.0.2}/mdbq/other/__init__.py +0 -0
  23. {mdbq-4.0.0 → mdbq-4.0.2}/mdbq/other/download_sku_picture.py +0 -0
  24. {mdbq-4.0.0 → mdbq-4.0.2}/mdbq/other/otk.py +0 -0
  25. {mdbq-4.0.0 → mdbq-4.0.2}/mdbq/other/pov_city.py +0 -0
  26. {mdbq-4.0.0 → mdbq-4.0.2}/mdbq/other/ua_sj.py +0 -0
  27. {mdbq-4.0.0 → mdbq-4.0.2}/mdbq/pbix/__init__.py +0 -0
  28. {mdbq-4.0.0 → mdbq-4.0.2}/mdbq/pbix/pbix_refresh.py +0 -0
  29. {mdbq-4.0.0 → mdbq-4.0.2}/mdbq/pbix/refresh_all.py +0 -0
  30. {mdbq-4.0.0 → mdbq-4.0.2}/mdbq/redis/__init__.py +0 -0
  31. {mdbq-4.0.0 → mdbq-4.0.2}/mdbq/spider/__init__.py +0 -0
  32. {mdbq-4.0.0 → mdbq-4.0.2}/mdbq.egg-info/SOURCES.txt +0 -0
  33. {mdbq-4.0.0 → mdbq-4.0.2}/mdbq.egg-info/dependency_links.txt +0 -0
  34. {mdbq-4.0.0 → mdbq-4.0.2}/mdbq.egg-info/top_level.txt +0 -0
  35. {mdbq-4.0.0 → mdbq-4.0.2}/setup.cfg +0 -0
  36. {mdbq-4.0.0 → mdbq-4.0.2}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: mdbq
3
- Version: 4.0.0
3
+ Version: 4.0.2
4
4
  Home-page: https://pypi.org/project/mdbq
5
5
  Author: xigua,
6
6
  Author-email: 2587125111@qq.com
@@ -0,0 +1 @@
1
+ VERSION = '4.0.2'
@@ -3,6 +3,7 @@ import re
3
3
  from mdbq.mysql import mysql
4
4
  from mdbq.mysql import s_query
5
5
  from mdbq.config import config
6
+ from mdbq.log import mylogger
6
7
  import datetime
7
8
  from dateutil.relativedelta import relativedelta
8
9
  import pandas as pd
@@ -13,7 +14,6 @@ import os
13
14
  import time
14
15
  import calendar
15
16
  import concurrent.futures
16
- import logging
17
17
 
18
18
  """
19
19
 
@@ -25,9 +25,17 @@ content = config.read_config(file_path=config_file)
25
25
  username, password, host, port = content['username'], content['password'], content['host'], content['port']
26
26
  m_engine = mysql.MysqlUpload(username=username, password=password, host=host, port=port, charset='utf8mb4')
27
27
 
28
- logger = logging.getLogger(__name__)
29
- # from mdbq.log import spider_logging
30
- # logger = spider_logging.setup_logging()
28
+ logger = mylogger.MyLogger(
29
+ logging_mode='file',
30
+ log_level='info',
31
+ log_format='json',
32
+ max_log_size=50,
33
+ backup_count=5,
34
+ enable_async=False, # 是否启用异步日志
35
+ sample_rate=1, # 采样DEBUG/INFO日志
36
+ sensitive_fields=[], # 敏感字段过滤
37
+ enable_metrics=False, # 是否启用性能指标
38
+ )
31
39
 
32
40
 
33
41
  class MysqlDatasQuery:
@@ -162,8 +170,7 @@ class MysqlDatasQuery:
162
170
  return
163
171
  min_date = df['日期'].min()
164
172
  max_date = df['日期'].max()
165
- now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
166
- logger.info(f'{now} 正在更新: mysql ({host}:{port}) {db_name}/{table_name} -> {min_date}~{max_date}')
173
+ logger.info(f'正在更新: mysql ({host}:{port}) {db_name}/{table_name} -> {min_date}~{max_date}')
167
174
  m_engine.df_to_mysql(
168
175
  df=df,
169
176
  db_name=db_name,
@@ -208,8 +215,7 @@ class MysqlDatasQuery:
208
215
  '花费': 'decimal(12,2)',
209
216
  '更新时间': 'timestamp',
210
217
  }
211
- now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
212
- logger.info(f'{now} 正在更新: mysql ({host}:{port}) 属性设置3/商品索引表_主推排序调用')
218
+ logger.info(f'正在更新: mysql ({host}:{port}) 属性设置3/商品索引表_主推排序调用')
213
219
  m_engine.df_to_mysql(
214
220
  df=df_pic,
215
221
  db_name='属性设置3',
@@ -317,8 +323,7 @@ class MysqlDatasQuery:
317
323
  return
318
324
  min_date = df['日期'].min()
319
325
  max_date = df['日期'].max()
320
- now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
321
- logger.info(f'{now} 正在更新: mysql ({host}:{port}) {db_name}/{table_name} -> {min_date}~{max_date}')
326
+ logger.info(f'正在更新: mysql ({host}:{port}) {db_name}/{table_name} -> {min_date}~{max_date}')
322
327
  m_engine.df_to_mysql(
323
328
  df=df,
324
329
  db_name=db_name,
@@ -426,8 +431,7 @@ class MysqlDatasQuery:
426
431
  return
427
432
  min_date = df['日期'].min()
428
433
  max_date = df['日期'].max()
429
- now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
430
- logger.info(f'{now} 正在更新: mysql ({host}:{port}) {db_name}/{table_name} -> {min_date}~{max_date}')
434
+ logger.info(f'正在更新: mysql ({host}:{port}) {db_name}/{table_name} -> {min_date}~{max_date}')
431
435
  m_engine.df_to_mysql(
432
436
  df=df,
433
437
  db_name=db_name,
@@ -535,8 +539,7 @@ class MysqlDatasQuery:
535
539
  return
536
540
  min_date = df['日期'].min()
537
541
  max_date = df['日期'].max()
538
- now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
539
- logger.info(f'{now} 正在更新: mysql ({host}:{port}) {db_name}/{table_name} -> {min_date}~{max_date}')
542
+ logger.info(f'正在更新: mysql ({host}:{port}) {db_name}/{table_name} -> {min_date}~{max_date}')
540
543
  m_engine.df_to_mysql(
541
544
  df=df,
542
545
  db_name=db_name,
@@ -630,8 +633,7 @@ class MysqlDatasQuery:
630
633
  return
631
634
  min_date = df['日期'].min()
632
635
  max_date = df['日期'].max()
633
- now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
634
- logger.info(f'{now} 正在更新: mysql ({host}:{port}) {db_name}/{table_name} -> {min_date}~{max_date}')
636
+ logger.info(f'正在更新: mysql ({host}:{port}) {db_name}/{table_name} -> {min_date}~{max_date}')
635
637
  m_engine.df_to_mysql(
636
638
  df=df,
637
639
  db_name=db_name,
@@ -847,8 +849,7 @@ class MysqlDatasQuery:
847
849
  }
848
850
  min_date = df['日期'].min()
849
851
  max_date = df['日期'].max()
850
- now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
851
- logger.info(f'{now} 正在更新: mysql ({host}:{port}) {db_name}/{table_name} -> {min_date}~{max_date}')
852
+ logger.info(f'正在更新: mysql ({host}:{port}) {db_name}/{table_name} -> {min_date}~{max_date}')
852
853
  m_engine.df_to_mysql(
853
854
  df=df,
854
855
  db_name=db_name,
@@ -981,8 +982,7 @@ class MysqlDatasQuery:
981
982
  }
982
983
  min_date = df['日期'].min()
983
984
  max_date = df['日期'].max()
984
- now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
985
- logger.info(f'{now} 正在更新: mysql ({host}:{port}) {db_name}/{table_name} -> {min_date}~{max_date}')
985
+ logger.info(f'正在更新: mysql ({host}:{port}) {db_name}/{table_name} -> {min_date}~{max_date}')
986
986
  m_engine.df_to_mysql(
987
987
  df=df,
988
988
  db_name=db_name,
@@ -1151,8 +1151,7 @@ class MysqlDatasQuery:
1151
1151
  }
1152
1152
  min_date = df['日期'].min()
1153
1153
  max_date = df['日期'].max()
1154
- now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
1155
- logger.info(f'{now} 正在更新: mysql ({host}:{port}) {db_name}/{table_name} -> {min_date}~{max_date}')
1154
+ logger.info(f'正在更新: mysql ({host}:{port}) {db_name}/{table_name} -> {min_date}~{max_date}')
1156
1155
 
1157
1156
  m_engine.df_to_mysql(
1158
1157
  df=df,
@@ -1263,8 +1262,7 @@ class MysqlDatasQuery:
1263
1262
  }
1264
1263
  min_date = df['日期'].min()
1265
1264
  max_date = df['日期'].max()
1266
- now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
1267
- logger.info(f'{now} 正在更新: mysql ({host}:{port}) {db_name}/{table_name} -> {min_date}~{max_date}')
1265
+ logger.info(f'正在更新: mysql ({host}:{port}) {db_name}/{table_name} -> {min_date}~{max_date}')
1268
1266
  m_engine.df_to_mysql(
1269
1267
  df=df,
1270
1268
  db_name=db_name,
@@ -1318,8 +1316,7 @@ class MysqlDatasQuery:
1318
1316
  # ) # 制作其他聚合表
1319
1317
  if not self.update_service:
1320
1318
  return
1321
- now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
1322
- logger.info(f'{now} 正在更新: mysql ({host}:{port}) {db_name}/{table_name}')
1319
+ logger.info(f'正在更新: mysql ({host}:{port}) {db_name}/{table_name}')
1323
1320
  m_engine.df_to_mysql(
1324
1321
  df=df,
1325
1322
  db_name=db_name,
@@ -1373,8 +1370,7 @@ class MysqlDatasQuery:
1373
1370
  # ) # 制作其他聚合表
1374
1371
  if not self.update_service:
1375
1372
  return
1376
- now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
1377
- logger.info(f'{now} 正在更新: mysql ({host}:{port}) {db_name}/{table_name}')
1373
+ logger.info(f'正在更新: mysql ({host}:{port}) {db_name}/{table_name}')
1378
1374
  m_engine.df_to_mysql(
1379
1375
  df=df,
1380
1376
  db_name=db_name,
@@ -1428,8 +1424,7 @@ class MysqlDatasQuery:
1428
1424
  # ) # 制作其他聚合表
1429
1425
  if not self.update_service:
1430
1426
  return
1431
- now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
1432
- logger.info(f'{now} 正在更新: mysql ({host}:{port}) {db_name}/{table_name}')
1427
+ logger.info(f'正在更新: mysql ({host}:{port}) {db_name}/{table_name}')
1433
1428
  m_engine.df_to_mysql(
1434
1429
  df=df,
1435
1430
  db_name=db_name,
@@ -1485,8 +1480,7 @@ class MysqlDatasQuery:
1485
1480
  # )
1486
1481
  if not self.update_service: # 调试加,是否继续执行下面的入库操作
1487
1482
  return
1488
- now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
1489
- logger.info(f'{now} 正在更新: mysql ({host}:{port}) {db_name}/{table_name}')
1483
+ logger.info(f'正在更新: mysql ({host}:{port}) {db_name}/{table_name}')
1490
1484
  m_engine.df_to_mysql(
1491
1485
  df=df,
1492
1486
  db_name=db_name,
@@ -1532,8 +1526,7 @@ class MysqlDatasQuery:
1532
1526
  df['上市年份'] = df['商品id'].apply(lambda x: check_year(x))
1533
1527
  p = df.pop('上市年份')
1534
1528
  df.insert(loc=5, column='上市年份', value=p)
1535
- now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
1536
- logger.info(f'{now} 正在更新: mysql ({host}:{port}) {db_name}/{table_name}')
1529
+ logger.info(f'正在更新: mysql ({host}:{port}) {db_name}/{table_name}')
1537
1530
  set_typ = {
1538
1531
  '日期': 'date',
1539
1532
  '店铺id': 'bigint',
@@ -1672,8 +1665,7 @@ class MysqlDatasQuery:
1672
1665
  }
1673
1666
  min_date = df['日期'].min().strftime("%Y-%m-%d")
1674
1667
  max_date = df['日期'].max().strftime("%Y-%m-%d")
1675
- now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
1676
- logger.info(f'{now} 正在更新: mysql ({host}:{port}) {db_name}/{table_name} -> {min_date}~{max_date}')
1668
+ logger.info(f'正在更新: mysql ({host}:{port}) {db_name}/{table_name} -> {min_date}~{max_date}')
1677
1669
  m_engine.df_to_mysql(
1678
1670
  df=df,
1679
1671
  db_name=db_name,
@@ -1780,8 +1772,7 @@ class MysqlDatasQuery:
1780
1772
  # df.to_csv('/Users/xigua/Downloads/ll.csv', index=False, header=True, encoding='utf-8_sig')
1781
1773
  min_date = df['日期'].min().strftime("%Y-%m-%d")
1782
1774
  max_date = df['日期'].max().strftime("%Y-%m-%d")
1783
- now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
1784
- logger.info(f'{now} 正在更新: mysql ({host}:{port}) {db_name}/{table_name} -> {min_date}~{max_date}')
1775
+ logger.info(f'正在更新: mysql ({host}:{port}) {db_name}/{table_name} -> {min_date}~{max_date}')
1785
1776
  m_engine.df_to_mysql(
1786
1777
  df=df,
1787
1778
  db_name=db_name,
@@ -1825,8 +1816,7 @@ class MysqlDatasQuery:
1825
1816
  return
1826
1817
  min_date = pd.to_datetime(df['日期'].min()).strftime('%Y-%m-%d')
1827
1818
  max_date = pd.to_datetime(df['日期'].max()).strftime('%Y-%m-%d')
1828
- now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
1829
- logger.info(f'{now} 正在更新: mysql ({host}:{port}) {db_name}/{table_name} -> {min_date}~{max_date}')
1819
+ logger.info(f'正在更新: mysql ({host}:{port}) {db_name}/{table_name} -> {min_date}~{max_date}')
1830
1820
  m_engine.df_to_mysql(
1831
1821
  df=df,
1832
1822
  db_name=db_name,
@@ -1939,8 +1929,7 @@ class MysqlDatasQuery:
1939
1929
  }
1940
1930
  min_date = df['日期'].min()
1941
1931
  max_date = df['日期'].max()
1942
- now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
1943
- logger.info(f'{now} 正在更新: mysql ({host}:{port}) {db_name}/{table_name} -> {min_date}~{max_date}')
1932
+ logger.info(f'正在更新: mysql ({host}:{port}) {db_name}/{table_name} -> {min_date}~{max_date}')
1944
1933
  m_engine.df_to_mysql(
1945
1934
  df=df,
1946
1935
  db_name=db_name,
@@ -2006,8 +1995,7 @@ class MysqlDatasQuery:
2006
1995
  }
2007
1996
  min_date = df['日期'].min()
2008
1997
  max_date = df['日期'].max()
2009
- now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
2010
- logger.info(f'{now} 正在更新: mysql ({host}:{port}) {db_name}/{table_name} -> {min_date}~{max_date}')
1998
+ logger.info(f'正在更新: mysql ({host}:{port}) {db_name}/{table_name} -> {min_date}~{max_date}')
2011
1999
  m_engine.df_to_mysql(
2012
2000
  df=df,
2013
2001
  db_name=db_name,
@@ -2105,8 +2093,7 @@ class MysqlDatasQuery:
2105
2093
  }
2106
2094
  min_date = df['日期'].min()
2107
2095
  max_date = df['日期'].max()
2108
- now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
2109
- logger.info(f'{now} 正在更新: mysql ({host}:{port}) {db_name}/{table_name} -> {min_date}~{max_date}')
2096
+ logger.info(f'正在更新: mysql ({host}:{port}) {db_name}/{table_name} -> {min_date}~{max_date}')
2110
2097
  m_engine.df_to_mysql(
2111
2098
  df=df,
2112
2099
  db_name=db_name,
@@ -2182,8 +2169,7 @@ class MysqlDatasQuery:
2182
2169
  }
2183
2170
  min_date = df['日期'].min()
2184
2171
  max_date = df['日期'].max()
2185
- now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
2186
- logger.info(f'{now} 正在更新: mysql ({host}:{port}) {db_name}/{table_name} -> {min_date}~{max_date}')
2172
+ logger.info(f'正在更新: mysql ({host}:{port}) {db_name}/{table_name} -> {min_date}~{max_date}')
2187
2173
  m_engine.df_to_mysql(
2188
2174
  df=df,
2189
2175
  db_name=db_name,
@@ -2251,8 +2237,7 @@ class MysqlDatasQuery:
2251
2237
  }
2252
2238
  min_date = df['日期'].min()
2253
2239
  max_date = df['日期'].max()
2254
- now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
2255
- logger.info(f'{now} 正在更新: mysql ({host}:{port}) {db_name}/{table_name} -> {min_date}~{max_date}')
2240
+ logger.info(f'正在更新: mysql ({host}:{port}) {db_name}/{table_name} -> {min_date}~{max_date}')
2256
2241
  m_engine.df_to_mysql(
2257
2242
  df=df,
2258
2243
  db_name=db_name,
@@ -2337,8 +2322,7 @@ class MysqlDatasQuery:
2337
2322
  }
2338
2323
  min_date = df['日期'].min()
2339
2324
  max_date = df['日期'].max()
2340
- now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
2341
- logger.info(f'{now} 正在更新: mysql ({host}:{port}) {db_name}/{table_name} -> {min_date}~{max_date}')
2325
+ logger.info(f'正在更新: mysql ({host}:{port}) {db_name}/{table_name} -> {min_date}~{max_date}')
2342
2326
  m_engine.df_to_mysql(
2343
2327
  df=df,
2344
2328
  db_name=db_name,
@@ -2473,8 +2457,7 @@ class MysqlDatasQuery:
2473
2457
  }
2474
2458
  min_date = df['日期'].min()
2475
2459
  max_date = df['日期'].max()
2476
- now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
2477
- logger.info(f'{now} 正在更新: mysql ({host}:{port}) {db_name}/{table_name} -> {min_date}~{max_date}')
2460
+ logger.info(f'正在更新: mysql ({host}:{port}) {db_name}/{table_name} -> {min_date}~{max_date}')
2478
2461
  new_dict = {
2479
2462
  '日期': '',
2480
2463
  '店铺名称': '',
@@ -2973,8 +2956,7 @@ class MysqlDatasQuery:
2973
2956
  return
2974
2957
  min_date = df['日期'].min().strftime('%Y-%m-%d')
2975
2958
  max_date = df['日期'].max().strftime('%Y-%m-%d')
2976
- now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
2977
- logger.info(f'{now} 正在更新: mysql ({host}:{port}) {db_name}/{table_name} -> {min_date}~{max_date}')
2959
+ logger.info(f'正在更新: mysql ({host}:{port}) {db_name}/{table_name} -> {min_date}~{max_date}')
2978
2960
  m_engine.df_to_mysql(
2979
2961
  df=df,
2980
2962
  db_name=db_name,
@@ -3063,8 +3045,7 @@ class MysqlDatasQuery:
3063
3045
  }
3064
3046
  min_date = df['日期'].min()
3065
3047
  max_date = df['日期'].max()
3066
- now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
3067
- logger.info(f'{now} 正在更新: mysql ({host}:{port}) {db_name}/{table_name} -> {min_date}~{max_date}')
3048
+ logger.info(f'正在更新: mysql ({host}:{port}) {db_name}/{table_name} -> {min_date}~{max_date}')
3068
3049
  m_engine.df_to_mysql(
3069
3050
  df=df,
3070
3051
  db_name=db_name,
@@ -3113,8 +3094,7 @@ class MysqlDatasQuery:
3113
3094
  }
3114
3095
  min_date = df['日期'].min()
3115
3096
  max_date = df['日期'].max()
3116
- now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
3117
- logger.info(f'{now} 正在更新: mysql ({host}:{port}) {db_name}/{table_name} -> {min_date}~{max_date}')
3097
+ logger.info(f'正在更新: mysql ({host}:{port}) {db_name}/{table_name} -> {min_date}~{max_date}')
3118
3098
  m_engine.df_to_mysql(
3119
3099
  df=df,
3120
3100
  db_name=db_name,
@@ -3223,8 +3203,7 @@ class MysqlDatasQuery:
3223
3203
  }
3224
3204
  min_date = df['日期'].min()
3225
3205
  max_date = df['日期'].max()
3226
- now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
3227
- logger.info(f'{now} 正在更新: mysql ({host}:{port}) {db_name}/{table_name} -> {min_date}~{max_date}')
3206
+ logger.info(f'正在更新: mysql ({host}:{port}) {db_name}/{table_name} -> {min_date}~{max_date}')
3228
3207
  m_engine.df_to_mysql(
3229
3208
  df=df,
3230
3209
  db_name=db_name,
@@ -3578,7 +3557,6 @@ class MysqlDatasQuery:
3578
3557
  '退货量_发货后': ('退货量_发货后', np.sum),
3579
3558
  }
3580
3559
  )
3581
- # logger.info(df.info())
3582
3560
 
3583
3561
  idbm['宝贝id'] = idbm['宝贝id'].astype('int64')
3584
3562
  # 1. id 编码表合并图片表
@@ -3587,7 +3565,6 @@ class MysqlDatasQuery:
3587
3565
  # 2. df 合并商品成本表
3588
3566
  df_cb = pd.merge(df_cb, cost, how='left', left_on='商家编码', right_on='款号')
3589
3567
  df_cb = df_cb[['宝贝id', '商家编码', '商品图片', '成本价']]
3590
- # logger.info(df_cb.info())
3591
3568
  # 3. 合并 df
3592
3569
  df = pd.merge(df, df_cb, how='left', left_on='商品id', right_on='宝贝id')
3593
3570
  df.drop(labels='宝贝id', axis=1, inplace=True)
@@ -3625,8 +3602,7 @@ class MysqlDatasQuery:
3625
3602
  return
3626
3603
  min_date = df['日期'].min()
3627
3604
  max_date = df['日期'].max()
3628
- now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
3629
- logger.info(f'{now} 正在更新: mysql ({host}:{port}) {db_name}/{table_name} -> {min_date}~{max_date}')
3605
+ logger.info(f'正在更新: mysql ({host}:{port}) {db_name}/{table_name} -> {min_date}~{max_date}')
3630
3606
  m_engine.df_to_mysql(
3631
3607
  df=df,
3632
3608
  db_name=db_name,
@@ -3726,8 +3702,7 @@ class MysqlDatasQuery:
3726
3702
  df['日期'] = pd.to_datetime(df['日期'], format='%Y-%m-%d', errors='ignore')
3727
3703
  min_date = df['日期'].min()
3728
3704
  max_date = df['日期'].max()
3729
- now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
3730
- logger.info(f'{now} 正在更新: mysql ({host}:{port}) {db_name}/{table_name} -> {min_date}~{max_date}')
3705
+ logger.info(f'正在更新: mysql ({host}:{port}) {db_name}/{table_name} -> {min_date}~{max_date}')
3731
3706
  m_engine.df_to_mysql(
3732
3707
  df=df,
3733
3708
  db_name=db_name,
@@ -3795,8 +3770,7 @@ class MysqlDatasQuery:
3795
3770
  return
3796
3771
  min_date = df['日期'].min().strftime("%Y-%m-%d")
3797
3772
  max_date = df['日期'].max().strftime("%Y-%m-%d")
3798
- now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
3799
- logger.info(f'{now} 正在更新: mysql ({host}:{port}) {db_name}/{table_name} -> {min_date}~{max_date}')
3773
+ logger.info(f'正在更新: mysql ({host}:{port}) {db_name}/{table_name} -> {min_date}~{max_date}')
3800
3774
  m_engine.df_to_mysql(
3801
3775
  df=df,
3802
3776
  db_name=db_name,
@@ -3856,11 +3830,9 @@ def date_table():
3856
3830
  for name, group in grouped:
3857
3831
  if num > 52:
3858
3832
  num = 1
3859
- # logger.info(f'Group: {name}')
3860
3833
  group['第n周_new'] = f'第{num}周'
3861
3834
  num += 1
3862
3835
  __res.append(group.copy())
3863
- # logger.info(group)
3864
3836
  # break
3865
3837
  df = pd.concat(__res, ignore_index=True)
3866
3838
  # df['日期'] = df['日期'].apply(lambda x: pd.to_datetime(x))
@@ -18,16 +18,15 @@ from contextlib import contextmanager
18
18
 
19
19
  warnings.filterwarnings('ignore')
20
20
  logger = mylogger.MyLogger(
21
- name='deduplicator',
22
21
  logging_mode='file',
23
22
  log_level='info',
24
- log_file='deduplicator.log',
25
23
  log_format='json',
26
24
  max_log_size=50,
27
25
  backup_count=5,
28
26
  enable_async=False, # 是否启用异步日志
29
- sample_rate=1, # 采样DEBUG/INFO日志, 0.5表示50%的日志会被采样
30
- sensitive_fields=[], # 敏感字段列表
27
+ sample_rate=1, # 采样DEBUG/INFO日志
28
+ sensitive_fields=[], # 敏感字段过滤
29
+ enable_metrics=False, # 是否启用性能指标
31
30
  )
32
31
 
33
32
 
@@ -17,16 +17,15 @@ warnings.filterwarnings('ignore')
17
17
  建表规范:
18
18
  """
19
19
  logger = mylogger.MyLogger(
20
- name='mysql',
21
- logging_mode='both',
20
+ logging_mode='file',
22
21
  log_level='info',
23
- log_file='mysql.log',
24
22
  log_format='json',
25
23
  max_log_size=50,
26
24
  backup_count=5,
27
25
  enable_async=False, # 是否启用异步日志
28
- sample_rate=0.5, # 采样50%的DEBUG/INFO日志
29
- sensitive_fields=[], # 敏感字段列表
26
+ sample_rate=1, # 采样DEBUG/INFO日志
27
+ sensitive_fields=[], # 敏感字段过滤
28
+ enable_metrics=False, # 是否启用性能指标
30
29
  )
31
30
 
32
31
 
@@ -4,14 +4,24 @@ import warnings
4
4
  import pymysql
5
5
  import pandas as pd
6
6
  from decimal import Decimal
7
- import logging
8
7
  from contextlib import closing
8
+ from mdbq.log import mylogger
9
9
 
10
10
  warnings.filterwarnings('ignore')
11
11
  """
12
12
  程序专门用来下载数据库数据, 并返回 df, 不做清洗数据操作;
13
13
  """
14
- logger = logging.getLogger(__name__)
14
+ logger = mylogger.MyLogger(
15
+ logging_mode='file',
16
+ log_level='info',
17
+ log_format='json',
18
+ max_log_size=50,
19
+ backup_count=5,
20
+ enable_async=False, # 是否启用异步日志
21
+ sample_rate=1, # 采样DEBUG/INFO日志
22
+ sensitive_fields=[], # 敏感字段过滤
23
+ enable_metrics=False, # 是否启用性能指标
24
+ )
15
25
 
16
26
 
17
27
  class QueryDatas:
@@ -7,16 +7,14 @@ from dbutils.pooled_db import PooledDB
7
7
  import os
8
8
 
9
9
  logger = mylogger.MyLogger(
10
- name='unique_',
11
10
  logging_mode='file',
12
- log_level='debug',
13
- log_file='unique_.log',
11
+ log_level='info',
14
12
  log_format='json',
15
13
  max_log_size=50,
16
14
  backup_count=5,
17
15
  enable_async=False, # 是否启用异步日志
18
- sample_rate=1, # 采样DEBUG/INFO日志, 0.5表示50%的日志会被采样
19
- sensitive_fields=[], # 敏感字段列表
16
+ sample_rate=1, # 采样DEBUG/INFO日志
17
+ sensitive_fields=[], # 敏感字段过滤
20
18
  enable_metrics=False, # 是否启用性能指标
21
19
  )
22
20
 
@@ -6,7 +6,9 @@ from functools import wraps
6
6
  import warnings
7
7
  import pymysql
8
8
  import pandas as pd
9
+ import os
9
10
  from mdbq.log import mylogger
11
+ from mdbq.config import config
10
12
  from typing import Union, List, Dict, Optional, Any, Tuple, Set
11
13
  from dbutils.pooled_db import PooledDB
12
14
  import json
@@ -15,16 +17,15 @@ from decimal import Decimal, InvalidOperation
15
17
 
16
18
  warnings.filterwarnings('ignore')
17
19
  logger = mylogger.MyLogger(
18
- name='uploader',
19
20
  logging_mode='file',
20
21
  log_level='info',
21
- log_file='uploader.log',
22
22
  log_format='json',
23
23
  max_log_size=50,
24
24
  backup_count=5,
25
25
  enable_async=False, # 是否启用异步日志
26
- sample_rate=1, # 采样DEBUG/INFO日志, 0.5表示50%的日志会被采样
27
- sensitive_fields=[], # 过滤敏感字段列表
26
+ sample_rate=1, # 采样DEBUG/INFO日志
27
+ sensitive_fields=[], # 敏感字段过滤
28
+ enable_metrics=False, # 是否启用性能指标
28
29
  )
29
30
 
30
31
 
@@ -951,7 +952,7 @@ class MySQLUploader:
951
952
  unique_keys: Optional[List[List[str]]] = None
952
953
  ):
953
954
  """
954
- 上传数据到数据库的主入口方法,分表逻辑异常处理统计丢弃数据
955
+ 上传数据到数据库的主入口方法
955
956
 
956
957
  :param db_name: 数据库名
957
958
  :param table_name: 表名
@@ -972,6 +973,23 @@ class MySQLUploader:
972
973
  - 'hybrid' : 混合模式(每N行提交,平衡性能与安全性)
973
974
  :param unique_keys: 唯一约束列表,每个元素为列名列表,支持多列组合唯一约束
974
975
  :raises: 可能抛出各种验证和数据库相关异常
976
+
977
+ ---
978
+ unique_keys、check_duplicate、update_on_duplicate 三者组合下的行为总结:
979
+
980
+ | unique_keys | check_duplicate | update_on_duplicate | 行为 |
981
+ |-------------|----------------|---------------------|------------------------------|
982
+ | 有/无 | False | False | 冲突时报错/跳过,不覆盖 |
983
+ | 有/无 | False | True | 冲突时覆盖(ON DUPLICATE KEY)|
984
+ | 有/无 | True | False | 主动查重,冲突时跳过,不覆盖 |
985
+ | 有/无 | True | True | 主动查重,冲突时覆盖 |
986
+
987
+ - unique_keys 只决定唯一性,不决定是否覆盖。
988
+ - check_duplicate=True 时,插入前主动查重,重复数据跳过或覆盖,取决于 update_on_duplicate。
989
+ - update_on_duplicate=True 时,遇到唯一约束冲突会用新数据覆盖旧数据。
990
+ - 只要 update_on_duplicate=True 且表存在唯一约束(如 unique_keys),无论 check_duplicate 是否为 True,都会更新旧数据(即 ON DUPLICATE KEY UPDATE 生效)。
991
+ - 如需"覆盖"行为,务必设置 update_on_duplicate=True,不管 check_duplicate 是否为 True。
992
+ - 如需"跳过"行为,设置 update_on_duplicate=False 即可。
975
993
  """
976
994
  # upload_start = time.time()
977
995
  if isinstance(data, list) or (hasattr(data, 'shape') and hasattr(data, '__len__')):
@@ -1336,7 +1354,16 @@ class MySQLUploader:
1336
1354
  transaction_mode: str,
1337
1355
  update_on_duplicate: bool = False
1338
1356
  ) -> Tuple[int, int, int]:
1339
- """执行批量插入操作,优化batch和hybrid模式"""
1357
+ """
1358
+ 执行批量插入操作,优化batch和hybrid模式。
1359
+
1360
+ - batch模式下,使用executemany批量插入(如SQL带ON DUPLICATE KEY UPDATE时),MySQL会对每一行单独判断唯一约束:
1361
+ - 不冲突的行会被正常插入。
1362
+ - 冲突的行会触发ON DUPLICATE KEY UPDATE,用新数据更新旧数据。
1363
+ - 不会因为一行冲突导致整批失败或回滚。
1364
+ - 只有遇到严重的数据库错误(如所有行都因唯一约束冲突且没有ON DUPLICATE KEY UPDATE),才会整体回滚。
1365
+ - 返回值为(插入行数, 跳过行数, 失败行数)。
1366
+ """
1340
1367
  import pymysql # 确保异常类型可用
1341
1368
  def get_optimal_batch_size(total_rows: int) -> int:
1342
1369
  if total_rows <= 100:
@@ -1534,19 +1561,16 @@ class MySQLUploader:
1534
1561
 
1535
1562
 
1536
1563
  def main():
1537
- """
1538
- 示例:
1539
- 1. 创建上传器实例
1540
- 2. 定义数据表结构
1541
- 3. 准备测试数据
1542
- 4. 上传数据到数据库
1543
- 5. 关闭连接
1544
- """
1564
+ dir_path = os.path.expanduser("~")
1565
+ my_cont = config.read_config(file_path=os.path.join(dir_path, 'spd.txt'))
1566
+ username, password, host, port = my_cont['username'], my_cont['password'], my_cont['host'], int(my_cont['port'])
1567
+ host = 'localhost'
1568
+
1545
1569
  uploader = MySQLUploader(
1546
- username='root',
1547
- password='pwd',
1548
- host='localhost',
1549
- port=3306,
1570
+ username=username,
1571
+ password=password,
1572
+ host=host,
1573
+ port=port,
1550
1574
  )
1551
1575
 
1552
1576
  # 定义列和数据类型
@@ -1562,7 +1586,7 @@ def main():
1562
1586
  data = [
1563
1587
  {'日期': '2023-01-8', 'name': 'JACk', 'AGE': '24', 'salary': 555.1545},
1564
1588
  {'日期': '2023-01-15', 'name': 'Alice', 'AGE': 35, 'salary': '100'},
1565
- {'日期': '2023-01-15', 'name': 'Alice', 'AGE': 30, 'salary': 0.0},
1589
+ {'日期': '2023-01-15', 'name': 'Alice', 'AGE': 5, 'salary': 15478},
1566
1590
  {'日期': '2023-02-20', 'name': 'Bob', 'AGE': 25, 'salary': 45000.75},
1567
1591
  ]
1568
1592
 
@@ -1575,7 +1599,7 @@ def main():
1575
1599
  primary_keys=[], # 创建唯一主键
1576
1600
  check_duplicate=False, # 检查重复数据
1577
1601
  duplicate_columns=[], # 指定排重的组合键
1578
- update_on_duplicate=False, # 更新旧数据
1602
+ update_on_duplicate=True, # 更新旧数据
1579
1603
  allow_null=False, # 允许插入空值
1580
1604
  partition_by='year', # 分表方式
1581
1605
  partition_date_column='日期', # 用于分表的日期列名,默认为'日期'
@@ -1588,5 +1612,5 @@ def main():
1588
1612
 
1589
1613
 
1590
1614
  if __name__ == '__main__':
1591
- # main()
1615
+ main()
1592
1616
  pass
@@ -1,34 +1,26 @@
1
1
  # -*- coding: UTF-8 –*-
2
- import os
3
2
  import random
4
3
  import pandas as pd
5
4
  import numpy as np
6
5
  import json
7
6
  import datetime
8
7
  import threading
9
- import logging
10
- from logging.handlers import RotatingFileHandler
8
+ from mdbq.log import mylogger
11
9
  from decimal import Decimal
12
10
  import orjson
13
11
 
14
12
  # 获取当前模块的日志记录器
15
- logger = logging.getLogger(__name__)
16
-
17
- # 创建一个文件处理器,用于将日志写入文件
18
- dir_path = os.path.expanduser("~")
19
- # config_file = os.path.join(dir_path, 'spd.txt')
20
- log_file = os.path.join(dir_path, 'logfile', 'redis.log')
21
- if not os.path.isdir(os.path.join(dir_path, 'logfile')):
22
- os.mkdir(os.path.join(dir_path, 'logfile'))
23
- file_handler = RotatingFileHandler(log_file, maxBytes=3 * 1024 * 1024, backupCount=10, encoding='utf-8') # 保留10个备份文件
24
- file_handler.setLevel(logging.INFO) # 设置文件处理器的日志级别
25
-
26
- # 创建一个日志格式器,并设置给文件处理器
27
- formatter = logging.Formatter('[%(asctime)s] %(levelname)s %(message)s', datefmt='%Y-%m-%d %H:%M:%S')
28
- file_handler.setFormatter(formatter)
29
-
30
- # 将文件处理器添加到日志记录器
31
- logger.addHandler(file_handler)
13
+ logger = mylogger.MyLogger(
14
+ logging_mode='file',
15
+ log_level='info',
16
+ log_format='json',
17
+ max_log_size=50,
18
+ backup_count=5,
19
+ enable_async=False, # 是否启用异步日志
20
+ sample_rate=1, # 采样DEBUG/INFO日志
21
+ sensitive_fields=[], # 敏感字段过滤
22
+ enable_metrics=False, # 是否启用性能指标
23
+ )
32
24
 
33
25
 
34
26
  class RedisData(object):
@@ -29,16 +29,14 @@ uld = uploader.MySQLUploader(username=username, password=password, host=host, po
29
29
  # 实例化一个数据查询类,用来获取 cookies 表数据
30
30
  download = s_query.QueryDatas(username=username, password=password, host=host, port=port)
31
31
  logger = mylogger.MyLogger(
32
- name='aikucun',
33
32
  logging_mode='file',
34
33
  log_level='info',
35
- log_file='aikucun.log',
36
34
  log_format='json',
37
35
  max_log_size=50,
38
36
  backup_count=5,
39
37
  enable_async=False, # 是否启用异步日志
40
- sample_rate=1, # 采样50%的DEBUG/INFO日志
41
- sensitive_fields=[], # 敏感字段列表
38
+ sample_rate=1, # 采样DEBUG/INFO日志
39
+ sensitive_fields=[], # 敏感字段过滤
42
40
  enable_metrics=False, # 是否启用性能指标
43
41
  )
44
42
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: mdbq
3
- Version: 4.0.0
3
+ Version: 4.0.2
4
4
  Home-page: https://pypi.org/project/mdbq
5
5
  Author: xigua,
6
6
  Author-email: 2587125111@qq.com
@@ -1 +0,0 @@
1
- VERSION = '4.0.0'
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