mdbq 1.5.4__py3-none-any.whl → 1.5.5__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/dataframe/converter.py +1 -0
- mdbq/mysql/mysql.py +75 -73
- {mdbq-1.5.4.dist-info → mdbq-1.5.5.dist-info}/METADATA +1 -1
- {mdbq-1.5.4.dist-info → mdbq-1.5.5.dist-info}/RECORD +6 -6
- {mdbq-1.5.4.dist-info → mdbq-1.5.5.dist-info}/WHEEL +0 -0
- {mdbq-1.5.4.dist-info → mdbq-1.5.5.dist-info}/top_level.txt +0 -0
mdbq/dataframe/converter.py
CHANGED
@@ -37,6 +37,7 @@ class DataFrameConverter(object):
|
|
37
37
|
df.replace(to_replace=['="'], value='', regex=True, inplace=True) # ="和"不可以放在一起清洗, 因为有: id=86785565
|
38
38
|
df.replace(to_replace=['"'], value='', regex=True, inplace=True)
|
39
39
|
cols = df.columns.tolist()
|
40
|
+
df.reset_index(inplace=True, drop=True) # 重置索引,避免下面的 df.loc[0, col] 会出错
|
40
41
|
|
41
42
|
for col in cols:
|
42
43
|
# 百分比在某些数据库中不兼容, 转换百分比为小数
|
mdbq/mysql/mysql.py
CHANGED
@@ -180,85 +180,87 @@ class MysqlUpload:
|
|
180
180
|
for data in datas:
|
181
181
|
# data 是传进来待处理的数据, 不是数据库数据
|
182
182
|
# data 示例: {'日期': Timestamp('2024-08-27 00:00:00'), '推广费余额': 33299, '品销宝余额': 2930.73, '短信剩余': 67471}
|
183
|
-
try:
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
cursor.execute(sql)
|
202
|
-
# else:
|
203
|
-
# print(f'重复数据不插入: {condition[:50]}...')
|
204
|
-
elif icm_update: # 增量更新, 专门用于聚合数据,其他库不要调用
|
205
|
-
""" 使用增量更新: 需确保 icm_update['主键'] 传进来的列必须是数据表中唯一主键,值不会发生变化且不会重复,否则可能产生覆盖情况 """
|
206
|
-
sql = 'SELECT COLUMN_NAME FROM information_schema.columns WHERE table_schema = %s AND table_name = %s'
|
207
|
-
cursor.execute(sql, (db_name, {table_name}))
|
208
|
-
columns = cursor.fetchall()
|
209
|
-
cols_exist = [col['COLUMN_NAME'] for col in columns] # 数据表的所有列, 返回 list
|
210
|
-
update_col = [item for item in cols_exist if item not in icm_update and item != 'id'] # 除了主键外的其他列
|
211
|
-
|
212
|
-
# unique_keys 示例: `日期`, `推广费余额`
|
213
|
-
unique_keys = ', '.join(f"`{item}`" for item in update_col) # 列名需要转义
|
214
|
-
condition = []
|
215
|
-
for up_col in icm_update:
|
216
|
-
condition += [f'`{up_col}` = "{data[up_col]}"']
|
217
|
-
condition = ' AND '.join(condition) # condition值示例: `品销宝余额` = '2930.73' AND `短信剩余` = '67471'
|
218
|
-
sql = f"SELECT {unique_keys} FROM `{table_name}` WHERE {condition}"
|
219
|
-
# print(sql)
|
220
|
-
# sql = f"SELECT {unique_keys} FROM `{table_name}` WHERE `创建时间` = '2014-09-19 14:32:33'"
|
183
|
+
# try:
|
184
|
+
cols = ', '.join(f"`{item}`" for item in data.keys()) # 列名需要转义
|
185
|
+
# data.update({item: f"{data[item]}" for item in data.keys()}) # 全部值转字符, 不是必须的
|
186
|
+
values = ', '.join([f'"{item}"' for item in data.values()]) # 值要加引号
|
187
|
+
condition = []
|
188
|
+
for k, v in data.items():
|
189
|
+
condition += [f'`{k}` = "{v}"']
|
190
|
+
condition = ' AND '.join(condition) # 构建查询条件
|
191
|
+
# print(condition)
|
192
|
+
|
193
|
+
if drop_duplicates: # 查重插入
|
194
|
+
sql = "SELECT %s FROM %s WHERE %s" % (cols, table_name, condition)
|
195
|
+
# sql = f"SELECT {cols} FROM `{table_name}` WHERE `创建时间` = '2014-09-19 14:32:33'"
|
196
|
+
# print(sql)
|
197
|
+
cursor.execute(sql)
|
198
|
+
result = cursor.fetchall() # 获取查询结果, 有结果返回 list 表示数据已存在(不重复插入),没有则返回空 tuple
|
199
|
+
if not result: # 数据不存在则插入
|
200
|
+
sql = f"INSERT INTO `{table_name}` ({cols}) VALUES (%s);" % (values)
|
221
201
|
cursor.execute(sql)
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
202
|
+
# else:
|
203
|
+
# print(f'重复数据不插入: {condition[:50]}...')
|
204
|
+
elif icm_update: # 增量更新, 专门用于聚合数据,其他库不要调用
|
205
|
+
""" 使用增量更新: 需确保 icm_update['主键'] 传进来的列必须是数据表中唯一主键,值不会发生变化且不会重复,否则可能产生覆盖情况 """
|
206
|
+
sql = 'SELECT COLUMN_NAME FROM information_schema.columns WHERE table_schema = %s AND table_name = %s'
|
207
|
+
cursor.execute(sql, (db_name, {table_name}))
|
208
|
+
columns = cursor.fetchall()
|
209
|
+
cols_exist = [col['COLUMN_NAME'] for col in columns] # 数据表的所有列, 返回 list
|
210
|
+
update_col = [item for item in cols_exist if item not in icm_update and item != 'id'] # 除了主键外的其他列
|
211
|
+
|
212
|
+
# unique_keys 示例: `日期`, `推广费余额`
|
213
|
+
unique_keys = ', '.join(f"`{item}`" for item in update_col) # 列名需要转义
|
214
|
+
condition = []
|
215
|
+
for up_col in icm_update:
|
216
|
+
condition += [f'`{up_col}` = "{data[up_col]}"']
|
217
|
+
condition = ' AND '.join(condition) # condition值示例: `品销宝余额` = '2930.73' AND `短信剩余` = '67471'
|
218
|
+
sql = f"SELECT {unique_keys} FROM `{table_name}` WHERE {condition}"
|
219
|
+
# print(sql)
|
220
|
+
# sql = f"SELECT {unique_keys} FROM `{table_name}` WHERE `创建时间` = '2014-09-19 14:32:33'"
|
221
|
+
cursor.execute(sql)
|
222
|
+
results = cursor.fetchall() # results 是数据库取出的数据
|
223
|
+
if results: # 有数据返回,再进行增量检查
|
224
|
+
for result in results: # results 是数据库数据, data 是传进来的数据
|
225
|
+
change_col = [] # 发生变化的列名
|
226
|
+
change_values = [] # 发生变化的数据
|
227
|
+
for col in update_col:
|
228
|
+
# 因为 mysql 里面有 decimal 数据类型,要移除末尾的 0 再做比较(df 默认将 5.00 小数截断为 5.0)
|
229
|
+
df_value = str(data[col])
|
230
|
+
mysql_value = str(result[col])
|
231
|
+
if '.' in df_value:
|
232
|
+
df_value = re.sub(r'0+$', '', df_value)
|
233
|
+
df_value = re.sub(r'\.$', '', df_value)
|
234
|
+
if '.' in mysql_value:
|
235
|
+
mysql_value = re.sub(r'0+$', '', mysql_value)
|
236
|
+
mysql_value = re.sub(r'\.$', '', mysql_value)
|
237
|
+
if df_value != mysql_value: # 传进来的数据和数据库比较, 有变化
|
238
|
+
# print(f'{data['日期']}{data['商品id']}{col} 列的值有变化,{str(data[col])} != {str(result[col])}')
|
239
|
+
change_values += [f"`{col}` = \"{str(data[col])}\""]
|
240
|
+
change_col.append(col)
|
241
|
+
not_change_col = [item for item in update_col if item not in change_col]
|
242
|
+
# change_values 是 df 传进来且和数据库对比后,发生了变化的数据,值示例: [`品销宝余额` = '9999.0', `短信剩余` = '888']
|
243
|
+
if change_values: # change_values 有数据返回,表示值需要更新
|
244
|
+
if not_change_col:
|
243
245
|
not_change_values = [f'`{col}` = "{str(data[col])}"' for col in not_change_col]
|
244
246
|
not_change_values = ' AND '.join(not_change_values) # 示例: `短信剩余` = '888' AND `test1` = '93'
|
245
247
|
# print(change_values, not_change_values)
|
246
248
|
condition += f' AND {not_change_values}' # 重新构建完整的查询条件,将未发生变化的列加进查询条件
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
cursor.execute(sql)
|
254
|
-
else:
|
255
|
-
sql = f"INSERT INTO `{table_name}` ({cols}) VALUES (%s);" % (values)
|
249
|
+
change_values = ', '.join(f"{item}" for item in change_values) # 注意这里 item 外面没有反引号
|
250
|
+
sql = "UPDATE `%s` SET %s WHERE %s" % (table_name, change_values, condition)
|
251
|
+
# print(sql)
|
252
|
+
cursor.execute(sql)
|
253
|
+
else: # 没有数据返回,则直接插入数据
|
254
|
+
sql = f"INSERT INTO `{table_name}` ({cols}) VALUES ({values});"
|
256
255
|
cursor.execute(sql)
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
256
|
+
else:
|
257
|
+
sql = f"INSERT INTO `{table_name}` ({cols}) VALUES (%s);" % (values)
|
258
|
+
cursor.execute(sql)
|
259
|
+
# except Exception as e:
|
260
|
+
# # print(data)
|
261
|
+
# # print(values)
|
262
|
+
# print(f'mysql -> df_to_mysql 报错: {e}, {self.filename}')
|
263
|
+
# # breakpoint()
|
262
264
|
connection.commit() # 提交事务
|
263
265
|
connection.close()
|
264
266
|
|
@@ -18,13 +18,13 @@ mdbq/config/products.py,sha256=vIK8DJ-F3XXwvNPK-4OJq2tZITNlL6Sub8QBdoOng8U,5676
|
|
18
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
|
-
mdbq/dataframe/converter.py,sha256=
|
21
|
+
mdbq/dataframe/converter.py,sha256=acNdbayG5924l8UFEoHuPn-6rAX0szzT7rm2UdYs9fc,3806
|
22
22
|
mdbq/log/__init__.py,sha256=Mpbrav0s0ifLL7lVDAuePEi1hJKiSHhxcv1byBKDl5E,15
|
23
23
|
mdbq/log/mylogger.py,sha256=oaT7Bp-Hb9jZt52seP3ISUuxVcI19s4UiqTeouScBO0,3258
|
24
24
|
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
|
-
mdbq/mysql/mysql.py,sha256=
|
27
|
+
mdbq/mysql/mysql.py,sha256=o2QRV3JZ_jva8u3ScFiMGcgnInSGFYfADm1-nEKMr4M,43051
|
28
28
|
mdbq/mysql/s_query.py,sha256=a33aYhW6gAnspIZfQ7l23ePln9-MD1f_ukypr5M0jd8,8018
|
29
29
|
mdbq/mysql/year_month_day.py,sha256=VgewoE2pJxK7ErjfviL_SMTN77ki8GVbTUcao3vFUCE,1523
|
30
30
|
mdbq/other/__init__.py,sha256=jso1oHcy6cJEfa7udS_9uO5X6kZLoPBF8l3wCYmr5dM,18
|
@@ -35,7 +35,7 @@ mdbq/pbix/__init__.py,sha256=Trtfaynu9RjoTyLLYBN2xdRxTvm_zhCniUkVTAYwcjo,24
|
|
35
35
|
mdbq/pbix/pbix_refresh.py,sha256=JUjKW3bNEyoMVfVfo77UhguvS5AWkixvVhDbw4_MHco,2396
|
36
36
|
mdbq/pbix/refresh_all.py,sha256=tgy762608HMaXWynbOURIf2UVMuSPybzrDXQnOOcnZU,6102
|
37
37
|
mdbq/spider/__init__.py,sha256=RBMFXGy_jd1HXZhngB2T2XTvJqki8P_Fr-pBcwijnew,18
|
38
|
-
mdbq-1.5.
|
39
|
-
mdbq-1.5.
|
40
|
-
mdbq-1.5.
|
41
|
-
mdbq-1.5.
|
38
|
+
mdbq-1.5.5.dist-info/METADATA,sha256=sojaLXm4UyJOVGaIdmUSed7v7vgOLZWovptcEW_oH5s,245
|
39
|
+
mdbq-1.5.5.dist-info/WHEEL,sha256=cpQTJ5IWu9CdaPViMhC9YzF8gZuS5-vlfoFihTBC86A,91
|
40
|
+
mdbq-1.5.5.dist-info/top_level.txt,sha256=2FQ-uLnCSB-OwFiWntzmwosW3X2Xqsg0ewh1axsaylA,5
|
41
|
+
mdbq-1.5.5.dist-info/RECORD,,
|
File without changes
|
File without changes
|