mdbq 1.5.1__tar.gz → 1.5.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.
- {mdbq-1.5.1 → mdbq-1.5.2}/PKG-INFO +1 -1
- {mdbq-1.5.1 → mdbq-1.5.2}/mdbq/aggregation/aggregation.py +6 -6
- {mdbq-1.5.1 → mdbq-1.5.2}/mdbq/aggregation/mysql_types.py +84 -85
- {mdbq-1.5.1 → mdbq-1.5.2}/mdbq/aggregation/query_data.py +10 -12
- {mdbq-1.5.1 → mdbq-1.5.2}/mdbq/company/copysh.py +3 -3
- {mdbq-1.5.1 → mdbq-1.5.2}/mdbq/config/products.py +1 -1
- {mdbq-1.5.1 → mdbq-1.5.2}/mdbq/mysql/mysql.py +12 -11
- {mdbq-1.5.1 → mdbq-1.5.2}/mdbq.egg-info/PKG-INFO +1 -1
- {mdbq-1.5.1 → mdbq-1.5.2}/setup.py +1 -1
- {mdbq-1.5.1 → mdbq-1.5.2}/README.txt +0 -0
- {mdbq-1.5.1 → mdbq-1.5.2}/mdbq/__init__.py +0 -0
- {mdbq-1.5.1 → mdbq-1.5.2}/mdbq/__version__.py +0 -0
- {mdbq-1.5.1 → mdbq-1.5.2}/mdbq/aggregation/__init__.py +0 -0
- {mdbq-1.5.1 → mdbq-1.5.2}/mdbq/aggregation/df_types.py +0 -0
- {mdbq-1.5.1 → mdbq-1.5.2}/mdbq/aggregation/optimize_data.py +0 -0
- {mdbq-1.5.1 → mdbq-1.5.2}/mdbq/bdup/__init__.py +0 -0
- {mdbq-1.5.1 → mdbq-1.5.2}/mdbq/bdup/bdup.py +0 -0
- {mdbq-1.5.1 → mdbq-1.5.2}/mdbq/clean/__init__.py +0 -0
- {mdbq-1.5.1 → mdbq-1.5.2}/mdbq/clean/data_clean.py +0 -0
- {mdbq-1.5.1 → mdbq-1.5.2}/mdbq/company/__init__.py +0 -0
- {mdbq-1.5.1 → mdbq-1.5.2}/mdbq/config/__init__.py +0 -0
- {mdbq-1.5.1 → mdbq-1.5.2}/mdbq/config/get_myconf.py +0 -0
- {mdbq-1.5.1 → mdbq-1.5.2}/mdbq/config/set_support.py +0 -0
- {mdbq-1.5.1 → mdbq-1.5.2}/mdbq/config/update_conf.py +0 -0
- {mdbq-1.5.1 → mdbq-1.5.2}/mdbq/dataframe/__init__.py +0 -0
- {mdbq-1.5.1 → mdbq-1.5.2}/mdbq/dataframe/converter.py +0 -0
- {mdbq-1.5.1 → mdbq-1.5.2}/mdbq/log/__init__.py +0 -0
- {mdbq-1.5.1 → mdbq-1.5.2}/mdbq/log/mylogger.py +0 -0
- {mdbq-1.5.1 → mdbq-1.5.2}/mdbq/mongo/__init__.py +0 -0
- {mdbq-1.5.1 → mdbq-1.5.2}/mdbq/mongo/mongo.py +0 -0
- {mdbq-1.5.1 → mdbq-1.5.2}/mdbq/mysql/__init__.py +0 -0
- {mdbq-1.5.1 → mdbq-1.5.2}/mdbq/mysql/s_query.py +0 -0
- {mdbq-1.5.1 → mdbq-1.5.2}/mdbq/mysql/year_month_day.py +0 -0
- {mdbq-1.5.1 → mdbq-1.5.2}/mdbq/other/__init__.py +0 -0
- {mdbq-1.5.1 → mdbq-1.5.2}/mdbq/other/porxy.py +0 -0
- {mdbq-1.5.1 → mdbq-1.5.2}/mdbq/other/pov_city.py +0 -0
- {mdbq-1.5.1 → mdbq-1.5.2}/mdbq/other/ua_sj.py +0 -0
- {mdbq-1.5.1 → mdbq-1.5.2}/mdbq/pbix/__init__.py +0 -0
- {mdbq-1.5.1 → mdbq-1.5.2}/mdbq/pbix/pbix_refresh.py +0 -0
- {mdbq-1.5.1 → mdbq-1.5.2}/mdbq/pbix/refresh_all.py +0 -0
- {mdbq-1.5.1 → mdbq-1.5.2}/mdbq/spider/__init__.py +0 -0
- {mdbq-1.5.1 → mdbq-1.5.2}/mdbq.egg-info/SOURCES.txt +0 -0
- {mdbq-1.5.1 → mdbq-1.5.2}/mdbq.egg-info/dependency_links.txt +0 -0
- {mdbq-1.5.1 → mdbq-1.5.2}/mdbq.egg-info/top_level.txt +0 -0
- {mdbq-1.5.1 → mdbq-1.5.2}/setup.cfg +0 -0
@@ -604,7 +604,7 @@ class DatabaseUpdate:
|
|
604
604
|
# }
|
605
605
|
# )
|
606
606
|
|
607
|
-
def upload_df(self, service_databases=[{}], path=None
|
607
|
+
def upload_df(self, service_databases=[{}], path=None):
|
608
608
|
"""
|
609
609
|
将清洗后的 df 上传数据库, copysh.py 调用
|
610
610
|
"""
|
@@ -662,7 +662,7 @@ class DatabaseUpdate:
|
|
662
662
|
df_sql=False, # 值为 True 时使用 df.to_sql 函数上传整个表, 不会排重
|
663
663
|
drop_duplicates=True, # 值为 True 时检查重复数据再插入,反之直接上传,会比较慢
|
664
664
|
filename=rt_filename, # 用来追踪处理进度
|
665
|
-
|
665
|
+
service_database=service_database, # 字典
|
666
666
|
)
|
667
667
|
df_to_json.as_json_file() # 写入 json 文件, 包含数据的 dtypes 信息
|
668
668
|
|
@@ -829,7 +829,7 @@ class DatabaseUpdate:
|
|
829
829
|
df_sql=False, # 值为 True 时使用 df.to_sql 函数上传整个表, 不会排重
|
830
830
|
drop_duplicates=True, # 值为 True 时检查重复数据再插入,反之直接上传,会比较慢
|
831
831
|
filename=None, # 用来追踪处理进度
|
832
|
-
|
832
|
+
service_name=service_name, # 用来追踪处理进度
|
833
833
|
)
|
834
834
|
# return df
|
835
835
|
|
@@ -859,11 +859,11 @@ class DatabaseUpdate:
|
|
859
859
|
df_sql=False, # 值为 True 时使用 df.to_sql 函数上传整个表, 不会排重
|
860
860
|
drop_duplicates=True, # 值为 True 时检查重复数据再插入,反之直接上传,会比较慢
|
861
861
|
filename=None, # 用来追踪处理进度
|
862
|
-
|
862
|
+
service_name=service_name, # 用来追踪处理进度
|
863
863
|
)
|
864
864
|
|
865
865
|
|
866
|
-
def upload_dir(path, db_name, collection_name, dbs={'mysql': True, 'mongodb': True}, json_path=None,
|
866
|
+
def upload_dir(path, db_name, collection_name, dbs={'mysql': True, 'mongodb': True}, json_path=None, service_name=None):
|
867
867
|
""" 上传一个文件夹到 mysql 或者 mongodb 数据库 """
|
868
868
|
if not os.path.isdir(path):
|
869
869
|
print(f'{os.path.splitext(os.path.basename(__file__))[0]}.upload_dir: 函数只接受文件夹路径,不是一个文件夹: {path}')
|
@@ -1036,7 +1036,7 @@ def test2():
|
|
1036
1036
|
# {'home_lx': 'mongodb'},
|
1037
1037
|
{'home_lx': 'mysql'},
|
1038
1038
|
# {'nas': 'mysql'}
|
1039
|
-
], path=None,
|
1039
|
+
], path=None, service_name=None)
|
1040
1040
|
|
1041
1041
|
|
1042
1042
|
if __name__ == '__main__':
|
@@ -38,7 +38,7 @@ class DataTypes:
|
|
38
38
|
数据简介: 记录 dataframe 或者数据库的列信息(dtypes),可以记录其信息或者加载相关信息用于入库使用,
|
39
39
|
第一字段为分类(如 dataframe/mysql),第二字段为数据库名,第三字段为集合名,第四段列名及其数据类型
|
40
40
|
"""
|
41
|
-
def __init__(self, path=None,
|
41
|
+
def __init__(self, path=None, service_name=None):
|
42
42
|
self.datas = {
|
43
43
|
'_json统计':
|
44
44
|
{
|
@@ -52,10 +52,10 @@ class DataTypes:
|
|
52
52
|
self.path = path
|
53
53
|
if not self.path:
|
54
54
|
self.path = set_support.SetSupport(dirname='support').dirname
|
55
|
-
self.
|
56
|
-
if not self.
|
57
|
-
self.
|
58
|
-
self.json_file = os.path.join(self.path, f'mysql_types_{self.
|
55
|
+
self.service_name = service_name
|
56
|
+
if not self.service_name:
|
57
|
+
self.service_name = 'home_lx'
|
58
|
+
self.json_file = os.path.join(self.path, f'mysql_types_{self.service_name}.json')
|
59
59
|
if not os.path.isdir(self.path):
|
60
60
|
os.makedirs(self.path)
|
61
61
|
if not os.path.isfile(self.json_file):
|
@@ -154,95 +154,94 @@ class DataTypes:
|
|
154
154
|
return {}, cl, None, None # 返回这些结果的目的是等添加完列再写 json 文件才能读到 types 信息
|
155
155
|
|
156
156
|
|
157
|
-
def mysql_all_dtypes(db_name=None, table_name=None,
|
157
|
+
def mysql_all_dtypes(db_name=None, table_name=None, service_database={'home_lx': 'mysql'}, path=None):
|
158
158
|
"""
|
159
159
|
更新笔记本 mysql 中所有数据库的 dtypes 信息到本地 json
|
160
160
|
"""
|
161
|
-
for
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
}
|
161
|
+
for service_name, database in service_database.items():
|
162
|
+
username, password, host, port = get_myconf.select_config_values(target_service=service_name, database=database)
|
163
|
+
config = {
|
164
|
+
'host': host,
|
165
|
+
'port': port,
|
166
|
+
'user': username,
|
167
|
+
'password': password,
|
168
|
+
'charset': 'utf8mb4', # utf8mb4 支持存储四字节的UTF-8字符集
|
169
|
+
'cursorclass': pymysql.cursors.DictCursor,
|
170
|
+
}
|
172
171
|
|
172
|
+
connection = pymysql.connect(**config) # 连接数据库
|
173
|
+
with connection.cursor() as cursor:
|
174
|
+
sql = "SHOW DATABASES;"
|
175
|
+
cursor.execute(sql)
|
176
|
+
db_name_lists = cursor.fetchall()
|
177
|
+
db_name_lists = [item['Database'] for item in db_name_lists]
|
178
|
+
connection.close()
|
179
|
+
|
180
|
+
sys_lists = ['information_schema', 'mysql', 'performance_schema', 'sakila', 'sys']
|
181
|
+
db_name_lists = [item for item in db_name_lists if item not in sys_lists]
|
182
|
+
|
183
|
+
# db_name_lists = [
|
184
|
+
# '京东数据2',
|
185
|
+
# '推广数据2',
|
186
|
+
# '市场数据2',
|
187
|
+
# '生意参谋2',
|
188
|
+
# '生意经2',
|
189
|
+
# '属性设置2',
|
190
|
+
# '聚合数据',
|
191
|
+
# ]
|
192
|
+
results = [] # 返回结果示例: [{'云电影': '电影更新'}, {'生意经2': 'e3_零售明细统计'}]
|
193
|
+
for db_ in db_name_lists:
|
194
|
+
config.update({'database': db_}) # 添加更新 config 字段
|
173
195
|
connection = pymysql.connect(**config) # 连接数据库
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
196
|
+
try:
|
197
|
+
with connection.cursor() as cursor:
|
198
|
+
sql = f"SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '{db_}';"
|
199
|
+
sql = "SHOW TABLES;"
|
200
|
+
cursor.execute(sql)
|
201
|
+
res_tables = cursor.fetchall()
|
202
|
+
for res_table in res_tables:
|
203
|
+
for k, v in res_table.items():
|
204
|
+
results.append({db_: v})
|
205
|
+
except:
|
206
|
+
pass
|
207
|
+
finally:
|
179
208
|
connection.close()
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
d = DataTypes(path=path, system_name=system_name)
|
213
|
-
for result in results:
|
214
|
-
for db_n, table_n in result.items():
|
215
|
-
# print(db_n, table_n, db_name, table_name)
|
216
|
-
if db_name and table_name: # 下载一个指定的数据表
|
217
|
-
if db_name != db_n or table_name != table_n:
|
218
|
-
continue
|
219
|
-
elif db_name: # 下载一个数据库的所有数据表
|
220
|
-
if db_name != db_n:
|
221
|
-
continue
|
222
|
-
# 如果 db_name 和 table_name 都不指定,则下载所有数据库的所有数据表
|
223
|
-
print(f'获取列信息 数据库: < {db_n} >, 数据表: < {table_n} >')
|
224
|
-
sq = s_query.QueryDatas(username=username, password=password, host=host, port=port)
|
225
|
-
# 获取数据表的指定列, 返回列表
|
226
|
-
# [{'视频bv号': 'BV1Dm4y1S7BU', '下载进度': 1}, {'视频bv号': 'BV1ov411c7US', '下载进度': 1}]
|
227
|
-
name_type = sq.dtypes_to_list(db_name=db_n, table_name=table_n)
|
228
|
-
if name_type:
|
229
|
-
dtypes = {item['COLUMN_NAME']: item['COLUMN_TYPE'] for item in name_type}
|
230
|
-
dtypes = {'mysql': {db_n: {table_n: dtypes}}}
|
231
|
-
d.get_mysql_types(
|
232
|
-
dtypes=dtypes,
|
233
|
-
cl='mysql',
|
234
|
-
db_name=db_n,
|
235
|
-
table_name=table_n,
|
236
|
-
is_file_dtype=True # True表示旧文件有限
|
237
|
-
)
|
238
|
-
else:
|
239
|
-
print(f'数据库回传数据(name_type)为空')
|
240
|
-
# print(d.datas)
|
241
|
-
d.as_json_file()
|
209
|
+
time.sleep(0.5)
|
210
|
+
|
211
|
+
d = DataTypes(path=path, service_name=service_name)
|
212
|
+
for result in results:
|
213
|
+
for db_n, table_n in result.items():
|
214
|
+
# print(db_n, table_n, db_name, table_name)
|
215
|
+
if db_name and table_name: # 下载一个指定的数据表
|
216
|
+
if db_name != db_n or table_name != table_n:
|
217
|
+
continue
|
218
|
+
elif db_name: # 下载一个数据库的所有数据表
|
219
|
+
if db_name != db_n:
|
220
|
+
continue
|
221
|
+
# 如果 db_name 和 table_name 都不指定,则下载所有数据库的所有数据表
|
222
|
+
print(f'获取列信息 数据库: < {db_n} >, 数据表: < {table_n} >')
|
223
|
+
sq = s_query.QueryDatas(username=username, password=password, host=host, port=port)
|
224
|
+
# 获取数据表的指定列, 返回列表
|
225
|
+
# [{'视频bv号': 'BV1Dm4y1S7BU', '下载进度': 1}, {'视频bv号': 'BV1ov411c7US', '下载进度': 1}]
|
226
|
+
name_type = sq.dtypes_to_list(db_name=db_n, table_name=table_n)
|
227
|
+
if name_type:
|
228
|
+
dtypes = {item['COLUMN_NAME']: item['COLUMN_TYPE'] for item in name_type}
|
229
|
+
dtypes = {'mysql': {db_n: {table_n: dtypes}}}
|
230
|
+
d.get_mysql_types(
|
231
|
+
dtypes=dtypes,
|
232
|
+
cl='mysql',
|
233
|
+
db_name=db_n,
|
234
|
+
table_name=table_n,
|
235
|
+
is_file_dtype=True # True表示旧文件有限
|
236
|
+
)
|
237
|
+
else:
|
238
|
+
print(f'数据库回传数据(name_type)为空')
|
239
|
+
# print(d.datas)
|
240
|
+
d.as_json_file()
|
242
241
|
|
243
242
|
|
244
243
|
if __name__ == '__main__':
|
245
244
|
# 更新 mysql 中所有数据库的 dtypes 信息到本地 json
|
246
245
|
mysql_all_dtypes(
|
247
|
-
path='/Users/xigua/Downloads',
|
246
|
+
path='/Users/xigua/Downloads', service_name='company',
|
248
247
|
)
|
@@ -577,7 +577,7 @@ class GroupBy:
|
|
577
577
|
df.to_excel(os.path.join(path, filename + '.xlsx'), index=index, header=header, engine=engine, freeze_panes=freeze_panes)
|
578
578
|
|
579
579
|
|
580
|
-
def data_aggregation_one(service_databases=[{}], months=1
|
580
|
+
def data_aggregation_one(service_databases=[{}], months=1):
|
581
581
|
"""
|
582
582
|
# 单独处理某一个聚合数据库,修改添加 data_dict 的值
|
583
583
|
"""
|
@@ -616,12 +616,11 @@ def data_aggregation_one(service_databases=[{}], months=1, system_name=None,):
|
|
616
616
|
table_name=table_name,
|
617
617
|
drop_duplicates=False,
|
618
618
|
icm_update=unique_key_list,
|
619
|
-
|
620
|
-
service_databases=service_databases,
|
619
|
+
service_database=service_database,
|
621
620
|
) # 3. 回传数据库
|
622
621
|
|
623
622
|
|
624
|
-
def data_aggregation(service_databases=[{}], months=1
|
623
|
+
def data_aggregation(service_databases=[{}], months=1):
|
625
624
|
"""
|
626
625
|
1. 从数据库中读取数据
|
627
626
|
2. 数据聚合清洗
|
@@ -692,8 +691,7 @@ def data_aggregation(service_databases=[{}], months=1, system_name=None,):
|
|
692
691
|
table_name=table_name,
|
693
692
|
drop_duplicates=False,
|
694
693
|
icm_update=unique_key_list,
|
695
|
-
|
696
|
-
service_databases=service_databases,
|
694
|
+
service_database=service_database,
|
697
695
|
) # 3. 回传数据库
|
698
696
|
res = g.performance(bb_tg=True) # 盈亏表,依赖其他表,单独做
|
699
697
|
m.df_to_mysql(
|
@@ -702,8 +700,7 @@ def data_aggregation(service_databases=[{}], months=1, system_name=None,):
|
|
702
700
|
table_name='_全店商品销售',
|
703
701
|
drop_duplicates=False,
|
704
702
|
icm_update=['日期', '商品id'], # 设置唯一主键
|
705
|
-
|
706
|
-
service_databases=service_databases,
|
703
|
+
service_database=service_database,
|
707
704
|
)
|
708
705
|
res = g.performance(bb_tg=False) # 盈亏表,依赖其他表,单独做
|
709
706
|
m.df_to_mysql(
|
@@ -712,8 +709,7 @@ def data_aggregation(service_databases=[{}], months=1, system_name=None,):
|
|
712
709
|
table_name='_推广商品销售',
|
713
710
|
drop_duplicates=False,
|
714
711
|
icm_update=['日期', '商品id'], # 设置唯一主键
|
715
|
-
|
716
|
-
service_databases=service_databases,
|
712
|
+
service_database=service_database,
|
717
713
|
)
|
718
714
|
|
719
715
|
# 这里要注释掉,不然 copysh.py 可能有问题,这里主要修改配置文件,后续触发 home_lx 的 optimize_datas.py(有s)程序进行全局清理
|
@@ -721,6 +717,8 @@ def data_aggregation(service_databases=[{}], months=1, system_name=None,):
|
|
721
717
|
|
722
718
|
|
723
719
|
if __name__ == '__main__':
|
724
|
-
# data_aggregation(service_databases=[{'home_lx': 'mysql'}], months=1
|
725
|
-
data_aggregation_one(service_databases=[{'company': 'mysql'}], months=1
|
720
|
+
# data_aggregation(service_databases=[{'home_lx': 'mysql'}], months=1)
|
721
|
+
data_aggregation_one(service_databases=[{'company': 'mysql'}], months=1)
|
726
722
|
# optimize_data.op_data(service_databases=[{'company': 'mysql'}], days=3650) # 立即启动对聚合数据的清理工作
|
723
|
+
|
724
|
+
|
@@ -327,7 +327,7 @@ def op_data(days: int =100):
|
|
327
327
|
)
|
328
328
|
|
329
329
|
# 数据聚合
|
330
|
-
query_data.data_aggregation(service_databases=[{'home_lx': 'mysql'}], months=3,
|
330
|
+
query_data.data_aggregation(service_databases=[{'home_lx': 'mysql'}], months=3,)
|
331
331
|
time.sleep(60)
|
332
332
|
|
333
333
|
# 清理聚合数据
|
@@ -347,7 +347,7 @@ def main():
|
|
347
347
|
dp = aggregation.DatabaseUpdate(path=d_path)
|
348
348
|
dp.new_unzip(is_move=True)
|
349
349
|
dp.cleaning(is_move=True) # 公司台式机需要移除自身下载的文件
|
350
|
-
dp.upload_df(service_databases=[{'company': 'mysql'}]
|
350
|
+
dp.upload_df(service_databases=[{'company': 'mysql'}])
|
351
351
|
dp.date_table(service_databases=[{'company': 'mysql'}]) # 因为日期表不受 days 参数控制,因此单独更新日期表
|
352
352
|
dp.other_table(service_databases=[{'company': 'mysql'}]) # 上传 support 文件夹下的 主推商品.csv
|
353
353
|
|
@@ -365,4 +365,4 @@ def main():
|
|
365
365
|
if __name__ == '__main__':
|
366
366
|
main()
|
367
367
|
# # 聚合数据,并清理聚合数据
|
368
|
-
# query_data.data_aggregation(service_databases=[{'company': 'mysql'}], months=1
|
368
|
+
# query_data.data_aggregation(service_databases=[{'company': 'mysql'}], months=1)
|
@@ -125,7 +125,7 @@ class Products:
|
|
125
125
|
table_name='货品年份基准',
|
126
126
|
df_sql=False, # 值为 True 时使用 df.to_sql 函数上传整个表, 不会排重
|
127
127
|
drop_duplicates=True, # 值为 True 时检查重复数据再插入,反之直接上传,会比较慢
|
128
|
-
|
128
|
+
service_database=service_database, # 用来追踪处理进度
|
129
129
|
)
|
130
130
|
|
131
131
|
def market_date(self, product_id: int):
|
@@ -57,7 +57,7 @@ class MysqlUpload:
|
|
57
57
|
}
|
58
58
|
self.filename = None
|
59
59
|
|
60
|
-
def df_to_mysql(self, df, table_name, db_name='远程数据源', icm_update=[],
|
60
|
+
def df_to_mysql(self, df, table_name, db_name='远程数据源', icm_update=[], service_database={'home_lx': 'mysql'}, df_sql=False, drop_duplicates=False, filename=None, count=None, json_path=None):
|
61
61
|
"""
|
62
62
|
将 df 写入数据库
|
63
63
|
db_name: 数据库名称
|
@@ -67,7 +67,6 @@ class MysqlUpload:
|
|
67
67
|
icm_update: 增量更新, 在聚合数据中使用,原始文件不要使用,设置此参数时需将 drop_duplicates 改为 False
|
68
68
|
使用增量更新: 必须确保 icm_update 传进来的列必须是数据表中唯一主键,值不会发生变化,不会重复,否则可能产生错乱覆盖情况
|
69
69
|
filename: 用来追踪处理进度,传这个参数是方便定位产生错误的文件
|
70
|
-
system_name: 同样是用来追踪处理进度
|
71
70
|
service_databases: 这个参数是用来设置更新哪台服务器的 types 信息到本地 json 文件
|
72
71
|
json_path: 这个参数同样也是是用来设置更新 json 文件
|
73
72
|
"""
|
@@ -111,8 +110,9 @@ class MysqlUpload:
|
|
111
110
|
cursor.execute(sql)
|
112
111
|
print(f'创建 mysql 表: {table_name}')
|
113
112
|
|
114
|
-
|
115
|
-
|
113
|
+
for service_name, database in service_database.items():
|
114
|
+
# 2. 列数据类型转换,将 df 数据类型转换为 mysql 的数据类型
|
115
|
+
dtypes, cl, db_n, tb_n = self.convert_dtypes(df=df, db_name=db_name, table_name=table_name, path=json_path, service_name=service_name)
|
116
116
|
|
117
117
|
# 有特殊字符不需转义
|
118
118
|
sql = "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = %s AND TABLE_NAME = %s;"
|
@@ -156,11 +156,11 @@ class MysqlUpload:
|
|
156
156
|
# 返回这些结果的目的是等添加完列再写 json 文件才能读到 types 信息
|
157
157
|
# ⚠️ mysql_all_dtypes 函数默认只读取 home_lx 的数据库信息,不会读取其他系统
|
158
158
|
if cl and db_n and tb_n:
|
159
|
-
mysql_types.mysql_all_dtypes(
|
159
|
+
mysql_types.mysql_all_dtypes(service_database=service_database, db_name=db_name, table_name=table_name) # 更新一个表的 dtypes
|
160
160
|
elif cl and db_n:
|
161
|
-
mysql_types.mysql_all_dtypes(
|
161
|
+
mysql_types.mysql_all_dtypes(service_database=service_database, db_name=db_name) # 更新一个数据库的 dtypes
|
162
162
|
elif cl:
|
163
|
-
mysql_types.mysql_all_dtypes(
|
163
|
+
mysql_types.mysql_all_dtypes(service_database=service_database) # 更新所有数据库所有数据表的 dtypes 信息到本地 json
|
164
164
|
|
165
165
|
# # 4. 移除指定日期范围内的数据,仅限于聚合数据使用,其他情况不要设置
|
166
166
|
# if drop_duplicates and '日期' in df.columns.tolist():
|
@@ -173,7 +173,8 @@ class MysqlUpload:
|
|
173
173
|
|
174
174
|
# 5. 更新插入数据
|
175
175
|
now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S ")
|
176
|
-
|
176
|
+
for service_name, database in service_database.items():
|
177
|
+
print(f'{now}正在更新 mysql ({self.host}:{self.port}) {db_name}/{table_name}, {count}, {service_name}, {self.filename}')
|
177
178
|
|
178
179
|
datas = df.to_dict(orient='records')
|
179
180
|
for data in datas:
|
@@ -261,7 +262,7 @@ class MysqlUpload:
|
|
261
262
|
connection.commit() # 提交事务
|
262
263
|
connection.close()
|
263
264
|
|
264
|
-
def convert_dtypes(self, df, db_name, table_name, path=None,
|
265
|
+
def convert_dtypes(self, df, db_name, table_name, path=None, service_name=None):
|
265
266
|
"""
|
266
267
|
根据本地 json 转换 df 的类型为 mysql 专有的数据类型
|
267
268
|
可能不存在本地 json 文件 (函数按指定规则转换并更新 json)
|
@@ -269,7 +270,7 @@ class MysqlUpload:
|
|
269
270
|
"""
|
270
271
|
cols = df.columns.tolist()
|
271
272
|
# path = set_support.SetSupport(dirname='support').dirname
|
272
|
-
d = mysql_types.DataTypes(path=path,
|
273
|
+
d = mysql_types.DataTypes(path=path, service_name=service_name)
|
273
274
|
# 从本地文件中读取 dtype 信息
|
274
275
|
dtypes, cl, db_n, tb_n = d.load_dtypes(cl='mysql', db_name=db_name, table_name=table_name)
|
275
276
|
# 可能会因为没有 json 文件, 返回 None
|
@@ -813,7 +814,7 @@ if __name__ == '__main__':
|
|
813
814
|
db_name='test',
|
814
815
|
table_name='测试数据',
|
815
816
|
drop_duplicates=True,
|
816
|
-
#
|
817
|
+
# service_name=service_name,
|
817
818
|
# service_databases=service_databases,
|
818
819
|
)
|
819
820
|
|
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
|
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
|