mdbq 1.0.8__py3-none-any.whl → 1.0.9__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/mysql_types.py +8 -8
- mdbq/mysql/mysql.py +56 -27
- {mdbq-1.0.8.dist-info → mdbq-1.0.9.dist-info}/METADATA +1 -1
- {mdbq-1.0.8.dist-info → mdbq-1.0.9.dist-info}/RECORD +6 -6
- {mdbq-1.0.8.dist-info → mdbq-1.0.9.dist-info}/WHEEL +0 -0
- {mdbq-1.0.8.dist-info → mdbq-1.0.9.dist-info}/top_level.txt +0 -0
mdbq/aggregation/mysql_types.py
CHANGED
@@ -133,19 +133,19 @@ class DataTypes:
|
|
133
133
|
if cl in self.datas.keys():
|
134
134
|
if db_name in list(self.datas[cl].keys()):
|
135
135
|
if table_name in list(self.datas[cl][db_name].keys()):
|
136
|
-
return self.datas[cl][db_name][table_name]
|
136
|
+
return self.datas[cl][db_name][table_name], None, None, None
|
137
137
|
else:
|
138
138
|
print(f'不存在的集合名信息: {table_name}, 文件位置: {self.json_file}')
|
139
|
-
mysql_all_dtypes(db_name=db_name, table_name=table_name) # 更新一个表的 dtypes
|
140
|
-
return {}
|
139
|
+
# mysql_all_dtypes(db_name=db_name, table_name=table_name) # 更新一个表的 dtypes
|
140
|
+
return {}, cl, db_name, table_name
|
141
141
|
else:
|
142
142
|
print(f'不存在的数据库信息: {db_name}, 文件位置: {self.json_file}')
|
143
|
-
mysql_all_dtypes(db_name=db_name) # 更新一个数据库的 dtypes
|
144
|
-
return {}
|
143
|
+
# mysql_all_dtypes(db_name=db_name) # 更新一个数据库的 dtypes
|
144
|
+
return {}, cl, db_name, None
|
145
145
|
else:
|
146
146
|
print(f'不存在的数据分类: {cl}, 文件位置: {self.json_file}')
|
147
|
-
mysql_all_dtypes() # 更新所有数据库所有数据表的 dtypes 信息到本地 json
|
148
|
-
return {}
|
147
|
+
# mysql_all_dtypes() # 更新所有数据库所有数据表的 dtypes 信息到本地 json
|
148
|
+
return {}, cl, None, None # 返回这些结果的目的是等添加完列再写 json 文件才能读到 types 信息
|
149
149
|
|
150
150
|
|
151
151
|
def mysql_all_dtypes(db_name=None, table_name=None, path=None):
|
@@ -155,7 +155,7 @@ def mysql_all_dtypes(db_name=None, table_name=None, path=None):
|
|
155
155
|
if not path:
|
156
156
|
path = set_support.SetSupport(dirname='support').dirname
|
157
157
|
|
158
|
-
username, password, host, port = get_myconf.select_config_values(target_service='
|
158
|
+
username, password, host, port = get_myconf.select_config_values(target_service='company', database='mysql')
|
159
159
|
config = {
|
160
160
|
'host': host,
|
161
161
|
'port': port,
|
mdbq/mysql/mysql.py
CHANGED
@@ -48,7 +48,7 @@ class MysqlUpload:
|
|
48
48
|
print(f'{db_name}: {table_name} 传入的 df 数据长度为0')
|
49
49
|
return
|
50
50
|
else:
|
51
|
-
print(f'{db_name}: {table_name} 传入的 df
|
51
|
+
print(f'{db_name}: {table_name} 传入的 df 不是有效的 dataframe 结构')
|
52
52
|
return
|
53
53
|
cv = converter.DataFrameConverter()
|
54
54
|
df = cv.convert_df_cols(df=df) # 清理 dataframe 非法值
|
@@ -82,7 +82,7 @@ class MysqlUpload:
|
|
82
82
|
print(f'创建 mysql 表: {table_name}')
|
83
83
|
|
84
84
|
# 2. 列数据类型转换,将 df 数据类型转换为 mysql 的数据类型
|
85
|
-
dtypes = self.convert_dtypes(df=df, db_name=db_name, table_name=table_name)
|
85
|
+
dtypes, cl, db_n, tb_n = self.convert_dtypes(df=df, db_name=db_name, table_name=table_name)
|
86
86
|
|
87
87
|
# 有特殊字符不需转义
|
88
88
|
sql = f"SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = '{db_name}' AND TABLE_NAME = '{table_name}';"
|
@@ -109,6 +109,14 @@ class MysqlUpload:
|
|
109
109
|
pass
|
110
110
|
connection.commit() # 提交事务
|
111
111
|
|
112
|
+
# 返回这些结果的目的是等添加完列再写 json 文件才能读到 types 信息
|
113
|
+
if cl and db_n and tb_n:
|
114
|
+
mysql_types.mysql_all_dtypes(db_name=db_name, table_name=table_name) # 更新一个表的 dtypes
|
115
|
+
elif cl and db_n:
|
116
|
+
mysql_types.mysql_all_dtypes(db_name=db_name) # 更新一个数据库的 dtypes
|
117
|
+
elif cl:
|
118
|
+
mysql_types.mysql_all_dtypes() # 更新所有数据库所有数据表的 dtypes 信息到本地 json
|
119
|
+
|
112
120
|
# 4. 移除指定日期范围内的数据,仅限于聚合数据使用,其他情况不要设置
|
113
121
|
if drop_duplicates and '日期' in df.columns.tolist():
|
114
122
|
dates = df['日期'].values.tolist()
|
@@ -123,24 +131,21 @@ class MysqlUpload:
|
|
123
131
|
print(f'{now}正在更新 mysql ({self.host}:{self.port}) {db_name}/{table_name}')
|
124
132
|
datas = df.to_dict(orient='records')
|
125
133
|
for data in datas:
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
134
|
+
cols = ', '.join(f"`{item}`" for item in data.keys()) # 列名转义
|
135
|
+
# data.update({item: f"{data[item]}" for item in data.keys()}) # 全部值转字符, 不是必须的
|
136
|
+
values = ', '.join([f"'{item}'" for item in data.values()]) # 值要加单引号 ''
|
137
|
+
condition = []
|
138
|
+
for k, v in data.items():
|
139
|
+
condition += [f"`{k}` = '{v}'"]
|
140
|
+
condition = ' AND '.join(condition) # 构建查询条件
|
141
|
+
# print(condition)
|
142
|
+
|
143
|
+
sql = f"SELECT {cols} FROM `{table_name}` WHERE {condition}"
|
144
|
+
cursor.execute(sql)
|
145
|
+
result = cursor.fetchall() # 获取查询结果, 如果有结果返回 list,没有则返回空元组 tuple
|
146
|
+
if not result: # 数据不存在则插入
|
147
|
+
sql = f"INSERT INTO `{table_name}` ({cols}) VALUES ({values});"
|
137
148
|
cursor.execute(sql)
|
138
|
-
result = cursor.fetchall() # 获取查询结果, 如果有结果返回 list,没有则返回空元组 tuple
|
139
|
-
if not result: # 数据不存在则插入
|
140
|
-
sql = f"INSERT INTO `{table_name}` ({cols}) VALUES ({values});"
|
141
|
-
cursor.execute(sql)
|
142
|
-
except:
|
143
|
-
pass
|
144
149
|
connection.commit() # 提交事务
|
145
150
|
|
146
151
|
def convert_dtypes(self, df, db_name, table_name):
|
@@ -155,7 +160,7 @@ class MysqlUpload:
|
|
155
160
|
# path = set_support.SetSupport(dirname='support').dirname
|
156
161
|
d = mysql_types.DataTypes()
|
157
162
|
# 从本地文件中读取 dtype 信息
|
158
|
-
dtypes = d.load_dtypes(cl='mysql', db_name=db_name, table_name=table_name)
|
163
|
+
dtypes, cl, db_n, tb_n = d.load_dtypes(cl='mysql', db_name=db_name, table_name=table_name)
|
159
164
|
# 可能会因为没有 json 文件, 返回 None
|
160
165
|
if dtypes:
|
161
166
|
# 按照文件记录更新 dtypes
|
@@ -171,7 +176,7 @@ class MysqlUpload:
|
|
171
176
|
dtypes.update({col: self.convert_dtype_to_sql(df=df, col=col, dtype=df[col].dtype) for col in col_not_exist})
|
172
177
|
# 至此 df 中全部列类型已经转换完成
|
173
178
|
# 返回结果, 示例: {'上市年份': 'mediumtext', '商品id': 'mediumtext', '平台': 'mediumtext'}
|
174
|
-
return dtypes
|
179
|
+
return dtypes, cl, db_n, tb_n # 返回这些结果的目的是等添加完列再写 json 文件才能读到 types 信息
|
175
180
|
|
176
181
|
def convert_dtype_to_sql(self, df, col, dtype):
|
177
182
|
""" 按照以下规则转换DataFrame列的数据类型为 MYSQL 专有的数据类型 """
|
@@ -199,7 +204,29 @@ class MysqlUpload:
|
|
199
204
|
return 'mediumtext'
|
200
205
|
return 'INT'
|
201
206
|
elif dtype == 'float64':
|
202
|
-
|
207
|
+
# step = len(str(max(df[col].tolist()))) # 数字长度包含小数点
|
208
|
+
int_step = len(str(max(df[col].tolist())).split('.')[0]) # 整数位数长度
|
209
|
+
f_step = len(str(max(df[col].tolist())).split('.')[1]) # 小数位数长度
|
210
|
+
if int_step >= 12:
|
211
|
+
return 'mediumtext' # mysql 中不要使用 float 和 double 类型,会影响计算结果
|
212
|
+
elif int_step >= 8 and f_step >= 0:
|
213
|
+
return 'decimal(16, 2)'
|
214
|
+
elif int_step >= 6 and f_step >= 0:
|
215
|
+
return 'decimal(10, 2)'
|
216
|
+
elif int_step >= 4 and f_step >= 0:
|
217
|
+
return 'decimal(10, 2)'
|
218
|
+
elif int_step >= 2 and f_step >= 6:
|
219
|
+
return 'decimal(12, 4)'
|
220
|
+
elif int_step >= 2 and f_step >= 4:
|
221
|
+
return 'decimal(10, 4)'
|
222
|
+
elif int_step >= 2 and f_step >= 0:
|
223
|
+
return 'decimal(10, 2)'
|
224
|
+
elif int_step >= 1 and f_step >= 6:
|
225
|
+
return 'decimal(10, 6)'
|
226
|
+
elif int_step >= 1 and f_step >= 4:
|
227
|
+
return 'decimal(10, 4)'
|
228
|
+
else:
|
229
|
+
return 'decimal(10, 2)'
|
203
230
|
elif dtype == 'object':
|
204
231
|
return 'mediumtext'
|
205
232
|
else:
|
@@ -647,8 +674,8 @@ def download_datas(table_name, save_path, start_date):
|
|
647
674
|
df.to_csv(path, index=False, encoding='utf-8_sig', header=True)
|
648
675
|
|
649
676
|
|
650
|
-
def one_file_to_mysql(file, db_name, table_name):
|
651
|
-
username, password, host, port = get_myconf.select_config_values(target_service=
|
677
|
+
def one_file_to_mysql(file, db_name, table_name, target_service, database):
|
678
|
+
username, password, host, port = get_myconf.select_config_values(target_service=target_service, database=database)
|
652
679
|
|
653
680
|
df = pd.read_csv(file, encoding='utf-8_sig', header=0, na_filter=False)
|
654
681
|
m = MysqlUpload(username=username, password=password, host=host, port=port)
|
@@ -659,11 +686,13 @@ if __name__ == '__main__':
|
|
659
686
|
username, password, host, port = get_myconf.select_config_values(target_service='company', database='mysql')
|
660
687
|
print(username, password, host, port)
|
661
688
|
|
662
|
-
file = '/Users/xigua
|
689
|
+
file = '/Users/xigua/Downloads/余额查询.csv'
|
663
690
|
one_file_to_mysql(
|
664
691
|
file=file,
|
665
|
-
db_name='
|
666
|
-
table_name='
|
692
|
+
db_name='test',
|
693
|
+
table_name='余额查询',
|
694
|
+
target_service='company',
|
695
|
+
database='mysql'
|
667
696
|
)
|
668
697
|
|
669
698
|
|
@@ -3,7 +3,7 @@ mdbq/__version__.py,sha256=y9Mp_8x0BCZSHsdLT_q5tX9wZwd5QgqrSIENLrb6vXA,62
|
|
3
3
|
mdbq/aggregation/__init__.py,sha256=EeDqX2Aml6SPx8363J-v1lz0EcZtgwIBYyCJV6CcEDU,40
|
4
4
|
mdbq/aggregation/aggregation.py,sha256=L1IyrfdSfCThg7sa2mFQ4hZWnHRhkIBF91FCQIEGAn0,53076
|
5
5
|
mdbq/aggregation/df_types.py,sha256=T35KML0sdch8GzIwo7CxSIrt72YVElBeCrsKQx4dX_0,7531
|
6
|
-
mdbq/aggregation/mysql_types.py,sha256=
|
6
|
+
mdbq/aggregation/mysql_types.py,sha256=xLqoiaMiuC4sF6Jr-BTd4wsBwCuKCNaaeHwTAJEMV_w,10313
|
7
7
|
mdbq/aggregation/optimize_data.py,sha256=jLAWtxPUuhpo4XTVrhKtT4xK3grs7r73ePQfLhxlu1I,779
|
8
8
|
mdbq/aggregation/query_data.py,sha256=9mer6idzVkJ4F9SzYjmBbXeUlfNg95PIMU10K58hBc4,25290
|
9
9
|
mdbq/bdup/__init__.py,sha256=AkhsGk81SkG1c8FqDH5tRq-8MZmFobVbN60DTyukYTY,28
|
@@ -25,7 +25,7 @@ mdbq/mongo/__init__.py,sha256=SILt7xMtQIQl_m-ik9WLtJSXIVf424iYgCfE_tnQFbw,13
|
|
25
25
|
mdbq/mongo/mongo.py,sha256=q0B4wXDSTtXg_vMN7MPh6zdxl6tT68tM74LmdVNQQek,31892
|
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=yxia60rwfc4uFsewBdinSfrxIgfLUsN4PqJlZSGwv-g,34146
|
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.0.
|
40
|
-
mdbq-1.0.
|
41
|
-
mdbq-1.0.
|
42
|
-
mdbq-1.0.
|
39
|
+
mdbq-1.0.9.dist-info/METADATA,sha256=9YaZkzP2cboALNY2oqjGrvAtBV-r2mtDa11G43Tz_iU,245
|
40
|
+
mdbq-1.0.9.dist-info/WHEEL,sha256=eOLhNAGa2EW3wWl_TU484h7q1UNgy0JXjjoqKoxAAQc,92
|
41
|
+
mdbq-1.0.9.dist-info/top_level.txt,sha256=2FQ-uLnCSB-OwFiWntzmwosW3X2Xqsg0ewh1axsaylA,5
|
42
|
+
mdbq-1.0.9.dist-info/RECORD,,
|
File without changes
|
File without changes
|