mdbq 1.1.9__py3-none-any.whl → 1.2.0__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/aggregation/aggregation.py +67 -89
- mdbq/config/set_support.py +1 -1
- mdbq/mysql/mysql.py +30 -38
- {mdbq-1.1.9.dist-info → mdbq-1.2.0.dist-info}/METADATA +1 -1
- {mdbq-1.1.9.dist-info → mdbq-1.2.0.dist-info}/RECORD +7 -7
- {mdbq-1.1.9.dist-info → mdbq-1.2.0.dist-info}/WHEEL +0 -0
- {mdbq-1.1.9.dist-info → mdbq-1.2.0.dist-info}/top_level.txt +0 -0
mdbq/aggregation/aggregation.py
CHANGED
@@ -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 信息,
|
45
|
-
2.
|
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
|
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]}.
|
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
|
-
|
921
|
-
|
922
|
-
#
|
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
|
927
|
-
d.client
|
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
|
-
|
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
|
-
|
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)
|
mdbq/config/set_support.py
CHANGED
@@ -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
|
-
|
170
|
-
|
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':
|
@@ -273,6 +282,7 @@ class MysqlUpload:
|
|
273
282
|
|
274
283
|
# @try_except
|
275
284
|
def read_mysql(self, table_name, start_date, end_date, db_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()
|
@@ -323,7 +333,7 @@ class MysqlUpload:
|
|
323
333
|
|
324
334
|
def upload_pandas(self, update_path, db_name, days=None):
|
325
335
|
"""
|
326
|
-
专门用来上传 pandas
|
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
|
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
|
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
|
-
|
726
|
-
|
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,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=
|
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=
|
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=
|
28
|
+
mdbq/mysql/mysql.py,sha256=3oj93ZsS6oouvFtKCgBedrstWk0a04sxUfyBczwpdoc,36321
|
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.
|
40
|
-
mdbq-1.
|
41
|
-
mdbq-1.
|
42
|
-
mdbq-1.
|
39
|
+
mdbq-1.2.0.dist-info/METADATA,sha256=fetztgyzYtDexrUW_I33MBm-sESNkUCNZRxdALg6cdo,245
|
40
|
+
mdbq-1.2.0.dist-info/WHEEL,sha256=cpQTJ5IWu9CdaPViMhC9YzF8gZuS5-vlfoFihTBC86A,91
|
41
|
+
mdbq-1.2.0.dist-info/top_level.txt,sha256=2FQ-uLnCSB-OwFiWntzmwosW3X2Xqsg0ewh1axsaylA,5
|
42
|
+
mdbq-1.2.0.dist-info/RECORD,,
|
File without changes
|
File without changes
|