mdbq 1.1.9__py3-none-any.whl → 1.2.1__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.
@@ -23,34 +23,17 @@ import getpass
23
23
 
24
24
  warnings.filterwarnings('ignore')
25
25
  """
26
- 建表规范:
27
- 1. 先建 json 表,再批量上传数据;(非常重要)
28
- 在初创数据表时, 如果有不同类报表,新版和旧版都要取一个文件,先创建数据表,再导其他数据;
29
- 例如有的报表转化率是0%,数据类型会被识别为2位小数: decimal(10, 2),正常值应类似 0.43%,应保留4个小数, 创建类型为 decimal(10, 4)
30
- 为了避免以上可能数据类型错误的情况,初创时要先检查一遍数据类型,确认没问题再导其他数据!
31
- 即导一个表,然后删除数据库,但保留 mysql_types.json,并检查表的数据类型(有问题就手动改 json 文件),之后会按 json 的 types 上传数据;
32
-
33
- 2. 数据库和数据表名如果有字母,必须使用小写,大写在建库后会自动变小写,再次上传数据会找不到数据库(macos和linux都有这种情况)
34
- 3. 无论是数据库/表/列名还是值,尽量避免特殊字符或者表情符号,数据库/表/列名尽量都使用 `列名` 转义,避免错误
35
- 4. 小数必须使用 decimal, 禁止 float 和 double, 因为计算精度差异,后续需要聚合数据时会引发很多问题
36
- 5. 日期类型暂时全部用 DATETIME,使用 DATE 在后续可能会重复插入不能排重,因为 df 进来的数据, 日期是带时间的,而数据库中日期不含时间
37
- 6. 目前小数自动适配类型转换,对于文本或者大数全部用 mediumtext, 因为部分表涉及爬虫数据,进来的字符长度未知,暂时统一 mediumtext 避免入库失败
38
-
39
-
40
-
41
26
  1. DatabaseUpdate: 程序用于对爬虫下载的原始数据进行清洗并入库;
42
- 数据清洗主要包括对字段名的非法字符处理,对 df 中的非法值进行预处理;
43
27
  数据入库时会较检并更新本地 json 文件的 dtypes 信息;
44
- 若 json 缺失 dtypes 信息, 可用 update_df_types_to_json 先更新, 或者手动修改添加本地 json 信息;
45
- 2. DataTypes: 类用于将某个csv文件的 dtypes 信息存入本地 json 文件, 会调用 converter 对 df 预处理;
46
- 作用于完善某个数据库 dtypes 信息,可以使用本函数更新;
47
- 3. update_df_types_to_json: 函数将一个 csv 文件的 dtypes 信息更新至本地 json 文件;
48
- 4. upload: 函数将一个文件夹上传至数据库;
49
- 如果本地 json 中确实这个数据库的 dtypes 信息, 请用 update_df_types_to_json 更新 json 文件再执行数据上传;
28
+ 若 json 缺失 dtypes 信息, 会按 df 类型自动转换并更新本地 json, 可以手动修改添加本地 json 信息,手动修改优先;
29
+ 2. upload_dir: 函数将一个文件夹上传至数据库;
50
30
  """
51
31
 
52
32
 
53
33
  class DatabaseUpdate:
34
+ """
35
+ 清洗文件,并入库,被 tg.py 调用
36
+ """
54
37
  def __init__(self, path):
55
38
  self.path = path # 数据所在目录, 即: 下载文件夹
56
39
  self.datas: list = [] # 带更新进数据库的数据集合
@@ -849,43 +832,48 @@ class DatabaseUpdate:
849
832
  return df
850
833
 
851
834
 
852
- def upload(path, db_name, collection_name):
853
- """ 上传一个文件夹到数据库 """
835
+ def upload_dir(path, db_name, collection_name, dbs={'mysql': True, 'mongodb': True}):
836
+ """ 上传一个文件夹到 mysql 或者 mongodb 数据库 """
854
837
  if not os.path.isdir(path):
855
- print(f'{os.path.splitext(os.path.basename(__file__))[0]}.upload: 函数只接受文件夹路径,不是一个文件夹: {path}')
838
+ print(f'{os.path.splitext(os.path.basename(__file__))[0]}.upload_dir: 函数只接受文件夹路径,不是一个文件夹: {path}')
856
839
  return
857
- username, password, host, port = get_myconf.select_config_values(
858
- target_service='home_lx',
859
- database='mongodb',
860
- )
861
- d = mongo.UploadMongo(
862
- username=username,
863
- password=password,
864
- host=host,
865
- port=port,
866
- drop_duplicates=False,
867
- )
868
- username, password, host, port = get_myconf.select_config_values(
869
- target_service='home_lx',
870
- database='mysql',
871
- )
872
- m = mysql.MysqlUpload(
873
- username=username,
874
- password=password,
875
- host=host,
876
- port=port,
877
- )
878
- username, password, host, port = get_myconf.select_config_values(
879
- target_service='nas',
880
- database='mysql',
881
- )
882
- nas = mysql.MysqlUpload(
883
- username=username,
884
- password=password,
885
- host=host,
886
- port=port,
887
- )
888
840
 
841
+ if dbs['mongodb']:
842
+ username, password, host, port = get_myconf.select_config_values(
843
+ target_service='home_lx',
844
+ database='mongodb',
845
+ )
846
+ d = mongo.UploadMongo(
847
+ username=username,
848
+ password=password,
849
+ host=host,
850
+ port=port,
851
+ drop_duplicates=False,
852
+ )
853
+
854
+ if dbs['mysql']:
855
+ username, password, host, port = get_myconf.select_config_values(
856
+ target_service='home_lx',
857
+ database='mysql',
858
+ )
859
+ m = mysql.MysqlUpload(
860
+ username=username,
861
+ password=password,
862
+ host=host,
863
+ port=port,
864
+ )
865
+ username, password, host, port = get_myconf.select_config_values(
866
+ target_service='nas',
867
+ database='mysql',
868
+ )
869
+ nas = mysql.MysqlUpload(
870
+ username=username,
871
+ password=password,
872
+ host=host,
873
+ port=port,
874
+ )
875
+
876
+ # 从本地 json 文件从读取 df 的数据类型信息
889
877
  df_to_json = df_types.DataTypes()
890
878
  dtypes = df_to_json.load_dtypes(
891
879
  db_name=db_name,
@@ -909,25 +897,34 @@ def upload(path, db_name, collection_name):
909
897
  cv = converter.DataFrameConverter()
910
898
  df = cv.convert_df_cols(df=df) # 清理列名和 df 中的非法字符
911
899
  try:
912
- df = df.astype(dtypes)
900
+ df = df.astype(dtypes) # 按本地文件更新 df 的数据类型, 可能因为字段不同产生异常
913
901
  except Exception as e:
914
902
  print(name, e)
903
+ # 如果发生异常,这将 df 的数据和 json 中的数据取交集
915
904
  old_dt = df.dtypes.apply(str).to_dict() # 将 dataframe 数据类型转为字典形式
916
905
  intersection_keys = dtypes.keys() & old_dt.keys() # 获取两个字典键的交集
917
906
  dtypes = {k: dtypes[k] for k in intersection_keys} # 使用交集的键创建新字典
918
- df = df.astype(dtypes)
907
+ df = df.astype(dtypes) # 再次更新 df 的数据类型
919
908
 
920
- d.df_to_mongo(df=df, db_name=db_name, collection_name=collection_name)
921
- m.df_to_mysql(df=df, db_name=db_name, table_name=collection_name, drop_dup=False, filename=name, count=f'{i}/{count}')
922
- # nas.df_to_mysql(df=df, db_name=db_name, table_name=collection_name)
909
+ if dbs['mongodb']:
910
+ d.df_to_mongo(df=df, db_name=db_name, collection_name=collection_name)
911
+ if dbs['mysql']: # drop_dup: 值为 True 时检查重复数据再插入
912
+ m.df_to_mysql(df=df, db_name=db_name, table_name=collection_name,
913
+ drop_dup=False, filename=name, count=f'{i}/{count}')
914
+ # nas.df_to_mysql(df=df, db_name=db_name, table_name=collection_name)
923
915
  except Exception as e:
924
916
  print(name, e)
925
917
  i += 1
926
- if d.client:
927
- d.client.close() # 必须手动关闭数据库连接
918
+ if dbs['mongodb']:
919
+ if d.client:
920
+ d.client.close() # 必须手动关闭数据库连接
928
921
 
929
922
 
930
923
  def one_file_to_mysql(file, db_name, table_name, target_service, database):
924
+ """ 上传单个文件到 mysql 数据库 file 参数是一个文件 """
925
+ if not os.path.isfile(file):
926
+ print(f'{os.path.splitext(os.path.basename(__file__))[0]}.one_file_to_mysql: 函数只接受文件, 此文件不存在: {file}')
927
+ return
931
928
  username, password, host, port = get_myconf.select_config_values(target_service=target_service, database=database)
932
929
  filename = os.path.basename(file)
933
930
  df = pd.read_csv(file, encoding='utf-8_sig', header=0, na_filter=False, float_precision='high')
@@ -937,14 +934,12 @@ def one_file_to_mysql(file, db_name, table_name, target_service, database):
937
934
 
938
935
  def file_dir(one_file=True):
939
936
  """
940
- 按照文件记录对照表
937
+ 按照文件记录对照表上传数据
941
938
  批量上传数据库
939
+ one_file: 值为 True 时每个文件夹取一个文件上传数据库,反之上传所有文件夹数据
942
940
  """
943
941
  filename = '文件目录对照表.csv'
944
- if platform.system() == 'Windows':
945
- path = 'C:\\同步空间\\BaiduSyncdisk\\原始文件2'
946
- else:
947
- path = '/Users/xigua/数据中心/原始文件2'
942
+ path = set_support.SetSupport(dirname='support').dirname # 根据平台自动适配 support 路径
948
943
  df = pd.read_csv(os.path.join(path, filename), encoding='utf-8_sig', header=0, na_filter=False)
949
944
  datas = df.to_dict('records') # 转字典
950
945
  for data in datas:
@@ -954,7 +949,7 @@ def file_dir(one_file=True):
954
949
  if platform.system() == 'Windows':
955
950
  sub_path = sub_path.replace('/', '\\')
956
951
  # print(os.path.join(path, sub_path), db_name, table_name)
957
- if one_file: # 从每个文件夹中取出一个文件
952
+ if one_file: # 从每个文件夹中取出一个文件上传
958
953
  real_path_list = []
959
954
  for root, dirs, files in os.walk(os.path.join(path, sub_path), topdown=False):
960
955
  for name in files:
@@ -970,35 +965,18 @@ def file_dir(one_file=True):
970
965
  database='mysql'
971
966
  )
972
967
  else: # 上传全部文件夹
973
- upload(
968
+ upload_dir(
974
969
  path=os.path.join(path, sub_path),
975
970
  db_name = db_name,
976
971
  collection_name = table_name,
977
972
  )
978
- data.update({'入库进度': 1}) # 更新进度
973
+ data.update({'入库进度': 1}) # 更新进度为已上传
974
+ # 将进度信息写回文件
979
975
  df = pd.DataFrame.from_dict(datas, orient='columns')
980
- # print(df)
981
976
  df.to_csv(os.path.join(path, filename), encoding='utf-8_sig', index=False, header=True)
982
977
 
983
978
 
984
- def main():
985
- d = DatabaseUpdate(path='/Users/xigua/Downloads')
986
- d.new_unzip(is_move=True)
987
- d.cleaning(is_move=False)
988
- d.upload_df(service_databases=[
989
- # {'home_lx': 'mongodb'},
990
- {'company': 'mysql'}
991
- ]
992
- )
993
- # print(d.datas)
994
-
995
-
996
979
  if __name__ == '__main__':
997
980
  # username, password, host, port = get_myconf.select_config_values(target_service='nas', database='mysql')
998
981
  # print(username, password, host, port)
999
- # upload(
1000
- # path='/Users/xigua/数据中心/原始文件2/生意经/E3零售明细统计',
1001
- # db_name = '生意经2',
1002
- # collection_name = 'e3_零售明细统计',
1003
- # )
1004
982
  file_dir(one_file=True)
@@ -14,7 +14,7 @@ class SetSupport:
14
14
  elif platform.system() == 'Darwin':
15
15
  self.dirname = f'/Users/{getpass.getuser()}/数据中心/自动0备份/py/数据更新/support'
16
16
  else:
17
- self.dirname = '数据中心/数据更新/support' # 不可用
17
+ self.dirname = '数据中心/数据更新/support' # 没有用可以删
18
18
 
19
19
 
20
20
  if __name__ == '__main__':
mdbq/mysql/mysql.py CHANGED
@@ -19,6 +19,25 @@ from mdbq.dataframe import converter
19
19
  from mdbq.aggregation import mysql_types
20
20
 
21
21
  warnings.filterwarnings('ignore')
22
+ """
23
+ 建表规范:
24
+ 1. 先建 json 表,再批量上传数据;(非常重要)
25
+ 在初创数据表时, 如果有不同类报表,新版和旧版都要取一个文件,先创建数据表,再导其他数据;
26
+ 例如有的报表转化率是0%,数据类型会被识别为2位小数: decimal(10, 2),正常值应类似 0.43%,应保留4个小数, 创建类型为 decimal(10, 4)
27
+ 为了避免以上可能数据类型错误的情况,初创时要先检查一遍数据类型,确认没问题再导其他数据!
28
+ 即导一个表,然后删除数据库,但保留 mysql_types.json,并检查表的数据类型(有问题就手动改 json 文件),之后会按 json 的 types 上传数据;
29
+
30
+ 2. 数据库和数据表名如果有字母,必须使用小写,大写在建库后会自动变小写,再次上传数据会找不到数据库(macos和linux都有这种情况)
31
+ 3. 无论是数据库/表/列名还是值,尽量避免特殊字符或者表情符号,数据库/表/列名尽量都使用 `列名` 转义,避免错误
32
+ 4. 小数必须使用 decimal, 禁止 float 和 double, 因为计算精度差异,后续需要聚合数据时会引发很多问题
33
+ 5. 日期类型暂时全部用 DATETIME,使用 DATE 在后续可能会重复插入不能排重,因为 df 进来的数据, 日期是带时间的,而数据库中日期不含时间
34
+ 6. 目前小数自动适配类型转换,对于文本或者大数全部用 mediumtext, 因为部分表涉及爬虫数据,进来的字符长度未知,暂时统一 mediumtext 避免入库失败
35
+
36
+
37
+
38
+
39
+
40
+ """
22
41
 
23
42
 
24
43
  class MysqlUpload:
@@ -43,6 +62,7 @@ class MysqlUpload:
43
62
  db_name: 数据库名称
44
63
  table_name: 集合/表名称
45
64
  drop_duplicates:仅限于聚合数据使用,其他情况不要设置
65
+ drop_dup: 值为 True 时检查重复数据再插入,反之直接上传
46
66
  filename: 传这个参数是方便定位产生错误的文件
47
67
  """
48
68
  self.filename = filename
@@ -166,11 +186,9 @@ class MysqlUpload:
166
186
 
167
187
  def convert_dtypes(self, df, db_name, table_name):
168
188
  """
169
- 根据本地已经存在的记录着 mysql dtypes 的 json 文件转换 df 的类型为 mysql 专有的数据类型
170
- 允许通过 json 文件指定列的数据类型
171
- 以下两种情况已经兼容:
172
- 1. 可能不存在本地 json 文件 (利用 convert_dtype_to_sql 函数按指定规则转换全部列)
173
- 2. json 文件中没有或者缺失部分列信息(利用 convert_dtype_to_sql 函数按指定规则转换缺失列)
189
+ 根据本地 json 转换 df 的类型为 mysql 专有的数据类型
190
+ 可能不存在本地 json 文件 (函数按指定规则转换并更新 json)
191
+ 允许通过 json 文件手动添加或修改列的数据类型(仅影响初创数据表)
174
192
  """
175
193
  cols = df.columns.tolist()
176
194
  # path = set_support.SetSupport(dirname='support').dirname
@@ -198,7 +216,7 @@ class MysqlUpload:
198
216
  """ 按照以下规则转换DataFrame列的数据类型为 MYSQL 专有的数据类型 """
199
217
 
200
218
  def find_longest_decimal_value(number_list):
201
- # 取列表中小数位数最长的值
219
+ # 针对小数设置的函数, 用来获取列表中小数位数最长的值
202
220
  longest_value = None
203
221
  max_decimals = 0
204
222
  for num in number_list:
@@ -212,19 +230,10 @@ class MysqlUpload:
212
230
  continue
213
231
  return longest_value
214
232
 
215
- # 最优先处理 ID 类型, 在 mysql 里面, 有些列数字过长不能存储为 int 类型
216
- # if 'id' in col or 'ID' in col or 'Id' in col or '摘要' in col or '商家编码' in col or '单号' in col or '款号' in col:
217
- # return 'mediumtext'
218
233
  if '商品编码' in col: # 京东sku/spu商品信息
219
234
  return 'mediumtext'
220
235
  if '文件大小' in col: # bw 程序
221
236
  return 'mediumtext'
222
- # elif '日期' in col or '时间' in col:
223
- # try:
224
- # k = pd.to_datetime(df[col].tolist()[0]) # 检查是否可以转为日期
225
- # return 'DATE'
226
- # except:
227
- # return 'mediumtext'
228
237
  elif dtype == 'datetime64[ns]':
229
238
  return 'DATETIME' # 使用 DATE 后续排重可能会引发不能排重
230
239
  elif dtype == 'int32':
@@ -272,7 +281,8 @@ class MysqlUpload:
272
281
  return 'mediumtext'
273
282
 
274
283
  # @try_except
275
- def read_mysql(self, table_name, start_date, end_date, db_name='远程数据源', ):
284
+ def read_mysql(self, table_name, start_date, end_date, db_name='远程数据源', date_name='日期'):
285
+ """ 读取指定数据表,可指定日期范围,返回结果: df """
276
286
  start_date = pd.to_datetime(start_date).strftime('%Y-%m-%d')
277
287
  end_date = pd.to_datetime(end_date).strftime('%Y-%m-%d')
278
288
  df = pd.DataFrame()
@@ -300,7 +310,7 @@ class MysqlUpload:
300
310
  try:
301
311
  with connection.cursor() as cursor:
302
312
  # 获取指定日期范围的数据
303
- sql = f"SELECT * FROM {db_name}.{table_name} WHERE {'日期'} BETWEEN '%s' AND '%s'" % (start_date, end_date)
313
+ sql = f"SELECT * FROM {db_name}.{table_name} WHERE {date_name} BETWEEN '%s' AND '%s'" % (start_date, end_date)
304
314
  cursor.execute(sql)
305
315
  rows = cursor.fetchall() # 获取查询结果
306
316
  columns = [desc[0] for desc in cursor.description]
@@ -323,7 +333,7 @@ class MysqlUpload:
323
333
 
324
334
  def upload_pandas(self, update_path, db_name, days=None):
325
335
  """
326
- 专门用来上传 pandas数据源的全部文件, 跳过 '其他数据' or '京东数据集'
336
+ 专门用来上传 pandas数据源的全部文件
327
337
  db_name: 数据库名: pandas数据源
328
338
  update_path: pandas数据源所在路径
329
339
  days: 更新近期数据,单位: 天, 不设置则全部更新
@@ -668,7 +678,7 @@ class OptimizeDatas:
668
678
  self.connection.close()
669
679
 
670
680
 
671
- def year_month_day(start_date, end_date):
681
+ def year_month_day_bak(start_date, end_date):
672
682
  """
673
683
  使用date_range函数和DataFrame来获取从start_date至end_date之间的所有年月日
674
684
  calendar.monthrange: 获取当月第一个工作日的星期值(0,6) 以及当月天数
@@ -694,7 +704,7 @@ def year_month_day(start_date, end_date):
694
704
  return results # start_date至end_date之间的所有年月日
695
705
 
696
706
 
697
- def download_datas(table_name, save_path, start_date):
707
+ def download_datas_bak(table_name, save_path, start_date):
698
708
  username, password, host, port = get_myconf.select_config_values(target_service='home_lx', database='mysql')
699
709
  print(username, password, host, port)
700
710
  m = MysqlUpload(username=username, password=password, host=host, port=port)
@@ -713,24 +723,6 @@ def download_datas(table_name, save_path, start_date):
713
723
  df.to_csv(path, index=False, encoding='utf-8_sig', header=True)
714
724
 
715
725
 
716
- def one_file_to_mysql(file, db_name, table_name, target_service, database):
717
- username, password, host, port = get_myconf.select_config_values(target_service=target_service, database=database)
718
- filename = os.path.basename(file)
719
- df = pd.read_csv(file, encoding='utf-8_sig', header=0, na_filter=False, float_precision='high')
720
- m = MysqlUpload(username=username, password=password, host=host, port=port)
721
- m.df_to_mysql(df=df, db_name=db_name, table_name=table_name, filename=filename)
722
-
723
-
724
726
  if __name__ == '__main__':
725
- # username, password, host, port = get_myconf.select_config_values(target_service='home_lx', database='mysql')
726
- # print(username, password, host, port)
727
-
728
- file = '/Users/xigua/数据中心/原始文件2/推广报表/创意报表/创意报表_万里马官方旗舰店_2024-07-05_2024-07-19.csv'
729
- one_file_to_mysql(
730
- file=file,
731
- db_name='推广数据2',
732
- table_name='创意报表',
733
- target_service='home_lx',
734
- database='mysql'
735
- )
736
-
727
+ username, password, host, port = get_myconf.select_config_values(target_service='home_lx', database='mysql')
728
+ print(username, password, host, port)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: mdbq
3
- Version: 1.1.9
3
+ Version: 1.2.1
4
4
  Home-page: https://pypi.org/project/mdbsql
5
5
  Author: xigua,
6
6
  Author-email: 2587125111@qq.com
@@ -1,7 +1,7 @@
1
1
  mdbq/__init__.py,sha256=Il5Q9ATdX8yXqVxtP_nYqUhExzxPC_qk_WXQ_4h0exg,16
2
2
  mdbq/__version__.py,sha256=y9Mp_8x0BCZSHsdLT_q5tX9wZwd5QgqrSIENLrb6vXA,62
3
3
  mdbq/aggregation/__init__.py,sha256=EeDqX2Aml6SPx8363J-v1lz0EcZtgwIBYyCJV6CcEDU,40
4
- mdbq/aggregation/aggregation.py,sha256=WxRpxcssqqkeCpc9m8r5v9EmSiTuhdusjhmcA-Bjm7Q,57483
4
+ mdbq/aggregation/aggregation.py,sha256=ixp32wsqZPpSc5xnod_9XX9t8FwUsArnD0L3Fk22hds,56107
5
5
  mdbq/aggregation/df_types.py,sha256=rHLIgv82PJSFmDvXkZyOJAffXkFyyMyFO23w9tUt8EQ,7525
6
6
  mdbq/aggregation/mysql_types.py,sha256=kzUAGM4FYp77tA_dvHjZNGyPoUAOU1WY5QD0uanh9I4,10418
7
7
  mdbq/aggregation/optimize_data.py,sha256=jLAWtxPUuhpo4XTVrhKtT4xK3grs7r73ePQfLhxlu1I,779
@@ -15,7 +15,7 @@ mdbq/company/copysh.py,sha256=i8f8YxmUg-EIzQR-ZHTtnC1A5InwsRtY1_sIsCznVp8,16363
15
15
  mdbq/config/__init__.py,sha256=jso1oHcy6cJEfa7udS_9uO5X6kZLoPBF8l3wCYmr5dM,18
16
16
  mdbq/config/get_myconf.py,sha256=bp6bVARZVm3ANj1pmM9hLB8Ao539TUWeM9xxeSsBpzw,5994
17
17
  mdbq/config/products.py,sha256=9gqXJMsw8KKuD4Xs6krNgcF7AuWDvV7clI6wVi3QjcA,4260
18
- mdbq/config/set_support.py,sha256=LJLEbUFrv8y-GVskiwOI8A9uRaCEAUa0Yfjugt4yLp0,768
18
+ mdbq/config/set_support.py,sha256=xkZCX6y9Bq1ppBpJAofld4B2YtchA7fl0eT3dx3CrSI,777
19
19
  mdbq/config/update_conf.py,sha256=taL3ZqKgiVWwUrDFuaYhim9a72Hm4BHRhhDscJTziR8,4535
20
20
  mdbq/dataframe/__init__.py,sha256=2HtCN8AdRj53teXDqzysC1h8aPL-mMFy561ESmhehGQ,22
21
21
  mdbq/dataframe/converter.py,sha256=6eVs8Bfj7-SaYksITEF0gZVa0U3eoTIDyFLSPiBwkhM,3400
@@ -25,7 +25,7 @@ mdbq/mongo/__init__.py,sha256=SILt7xMtQIQl_m-ik9WLtJSXIVf424iYgCfE_tnQFbw,13
25
25
  mdbq/mongo/mongo.py,sha256=v9qvrp6p1ZRWuPpbSilqveiE0FEcZF7U5xUPI0RN4xs,31880
26
26
  mdbq/mysql/__init__.py,sha256=A_DPJyAoEvTSFojiI2e94zP0FKtCkkwKP1kYUCSyQzo,11
27
27
  mdbq/mysql/data_types_即将删除.py,sha256=sjBBDKr9674LdjM5N_dwyJACdZPbdB8Beli59jGdgnQ,10378
28
- mdbq/mysql/mysql.py,sha256=bilmjcbrxk9x1gmBZdAYlV8b8IV8N_1w0Kc0Z7OBkDw,36139
28
+ mdbq/mysql/mysql.py,sha256=Urzkj_qq0-uxE0Z2xzVBzxpVySgn9HN-5zcNYrKh6G8,36340
29
29
  mdbq/mysql/s_query.py,sha256=4c24SwbqtnO33o8CgWlTQ_j8sZYl5BRIQkaD9CI-vTY,7901
30
30
  mdbq/mysql/year_month_day.py,sha256=VgewoE2pJxK7ErjfviL_SMTN77ki8GVbTUcao3vFUCE,1523
31
31
  mdbq/other/__init__.py,sha256=jso1oHcy6cJEfa7udS_9uO5X6kZLoPBF8l3wCYmr5dM,18
@@ -36,7 +36,7 @@ mdbq/pbix/__init__.py,sha256=Trtfaynu9RjoTyLLYBN2xdRxTvm_zhCniUkVTAYwcjo,24
36
36
  mdbq/pbix/pbix_refresh.py,sha256=JUjKW3bNEyoMVfVfo77UhguvS5AWkixvVhDbw4_MHco,2396
37
37
  mdbq/pbix/refresh_all.py,sha256=tgy762608HMaXWynbOURIf2UVMuSPybzrDXQnOOcnZU,6102
38
38
  mdbq/spider/__init__.py,sha256=RBMFXGy_jd1HXZhngB2T2XTvJqki8P_Fr-pBcwijnew,18
39
- mdbq-1.1.9.dist-info/METADATA,sha256=j2Hb38pzsnXQygnoN_PPHfgkr1jDtHJVkgh0qmPsYn0,245
40
- mdbq-1.1.9.dist-info/WHEEL,sha256=cpQTJ5IWu9CdaPViMhC9YzF8gZuS5-vlfoFihTBC86A,91
41
- mdbq-1.1.9.dist-info/top_level.txt,sha256=2FQ-uLnCSB-OwFiWntzmwosW3X2Xqsg0ewh1axsaylA,5
42
- mdbq-1.1.9.dist-info/RECORD,,
39
+ mdbq-1.2.1.dist-info/METADATA,sha256=wfmNht4OBp25nuHp2Sx_FdVfCB9oWHQAaLvBjctBxO0,245
40
+ mdbq-1.2.1.dist-info/WHEEL,sha256=cpQTJ5IWu9CdaPViMhC9YzF8gZuS5-vlfoFihTBC86A,91
41
+ mdbq-1.2.1.dist-info/top_level.txt,sha256=2FQ-uLnCSB-OwFiWntzmwosW3X2Xqsg0ewh1axsaylA,5
42
+ mdbq-1.2.1.dist-info/RECORD,,
File without changes