mdbq 1.5.4__py3-none-any.whl → 1.5.6__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/config/get_myconf.py CHANGED
@@ -21,7 +21,7 @@ class MyConf:
21
21
 
22
22
  def get_myconf(self, options: list):
23
23
  if not os.path.exists(self.conf_file):
24
- print(f'尚未配置: 缺少 .my_conf 文件')
24
+ print(f'尚未配置: 缺少 .my_conf 文件 {self.conf_file}')
25
25
  return
26
26
  if not options:
27
27
  print(f'传入的参数为空: {options}')
@@ -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
- 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)
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
- results = cursor.fetchall() # results 是数据库取出的数据
223
- if results: # 有数据返回,再进行增量检查
224
- for result in results: # results 是数据库数据, data 是传进来的数据
225
- not_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
- not_change_col += [item for item in update_col if item != col]
241
- # change_values 是 df 传进来且和数据库对比后,发生了变化的数据,值示例: [`品销宝余额` = '9999.0', `短信剩余` = '888']
242
- if change_values: # change_values 有数据返回,表示值需要更新
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
- change_values = ', '.join(f"{item}" for item in change_values) # 注意这里 item 外面没有反引号
248
- sql = f"UPDATE {table_name} SET {change_values} WHERE {condition}"
249
- # print(sql)
250
- cursor.execute(sql)
251
- else: # 没有数据返回,则直接插入数据
252
- sql = f"INSERT INTO `{table_name}` ({cols}) VALUES ({values});"
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
- except Exception as e:
258
- # print(data)
259
- # print(values)
260
- print(f'mysql -> df_to_mysql 报错: {e}, {self.filename}')
261
- # breakpoint()
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
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: mdbq
3
- Version: 1.5.4
3
+ Version: 1.5.6
4
4
  Home-page: https://pypi.org/project/mdbsql
5
5
  Author: xigua,
6
6
  Author-email: 2587125111@qq.com
@@ -13,18 +13,18 @@ mdbq/clean/data_clean.py,sha256=BIzc1XCJjJaZyPT6DCRXRCCRwBaeC5_lER0aqYF1P3M,8777
13
13
  mdbq/company/__init__.py,sha256=qz8F_GsP_pMB5PblgJAUAMjasuZbOEp3qQOCB39E8f0,21
14
14
  mdbq/company/copysh.py,sha256=WCZ92vCJAy6_ZFeOxWL-U9gArIpyga4xts-s1wKsspY,17268
15
15
  mdbq/config/__init__.py,sha256=jso1oHcy6cJEfa7udS_9uO5X6kZLoPBF8l3wCYmr5dM,18
16
- mdbq/config/get_myconf.py,sha256=bp6bVARZVm3ANj1pmM9hLB8Ao539TUWeM9xxeSsBpzw,5994
16
+ mdbq/config/get_myconf.py,sha256=-CFEW0dQh4OIwVgwK-cL0eVp1LN3PjJgN89d4P5TB9I,6011
17
17
  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=w0-gGJnIajGIhOgYGkCvc0JMcmxIHNpgPf_bgWUSOG4,3699
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=odWLYE4deH0AYO_EeCyf3vpw3-jEgmQW0cu572sGrdQ,43137
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.4.dist-info/METADATA,sha256=hInTl3JNbUASWDNTi5AiSKMBL38BeugG0xcqN0QilFA,245
39
- mdbq-1.5.4.dist-info/WHEEL,sha256=cpQTJ5IWu9CdaPViMhC9YzF8gZuS5-vlfoFihTBC86A,91
40
- mdbq-1.5.4.dist-info/top_level.txt,sha256=2FQ-uLnCSB-OwFiWntzmwosW3X2Xqsg0ewh1axsaylA,5
41
- mdbq-1.5.4.dist-info/RECORD,,
38
+ mdbq-1.5.6.dist-info/METADATA,sha256=CISMYo5CRiOFsR7h_GgYSRkLgZydZnoKAvLj078WmoA,245
39
+ mdbq-1.5.6.dist-info/WHEEL,sha256=cpQTJ5IWu9CdaPViMhC9YzF8gZuS5-vlfoFihTBC86A,91
40
+ mdbq-1.5.6.dist-info/top_level.txt,sha256=2FQ-uLnCSB-OwFiWntzmwosW3X2Xqsg0ewh1axsaylA,5
41
+ mdbq-1.5.6.dist-info/RECORD,,
File without changes