mdbq 4.0.63__py3-none-any.whl → 4.0.64__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/__version__.py CHANGED
@@ -1 +1 @@
1
- VERSION = '4.0.63'
1
+ VERSION = '4.0.64'
mdbq/mysql/uploader.py CHANGED
@@ -267,7 +267,7 @@ class MySQLUploader:
267
267
  :return: 存在返回True,否则返回False
268
268
  :raises: 可能抛出数据库相关异常
269
269
  """
270
- db_name = self._validate_identifier(db_name)
270
+ db_name = self._validate_identifier(db_name, is_database=True)
271
271
  sql = 'SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = %s'
272
272
  conn = None
273
273
  try:
@@ -289,7 +289,7 @@ class MySQLUploader:
289
289
  :param db_name: 要创建的数据库名称
290
290
  :raises: 可能抛出数据库相关异常
291
291
  """
292
- db_name = self._validate_identifier(db_name)
292
+ db_name = self._validate_identifier(db_name, is_database=True)
293
293
  sql = f'CREATE DATABASE IF NOT EXISTS `{db_name}` CHARACTER SET {self.charset} COLLATE {self.collation}'
294
294
  conn = None
295
295
  try:
@@ -327,11 +327,12 @@ class MySQLUploader:
327
327
  logger.error('分表方式无效', {'表': table_name, '分表方式': partition_by})
328
328
  raise ValueError("分表方式必须是 'year' 或 'month' 或 'None'")
329
329
 
330
- def _validate_identifier(self, identifier: str) -> str:
330
+ def _validate_identifier(self, identifier: str, is_database: bool = False) -> str:
331
331
  """
332
332
  验证并清理数据库标识符(表名、列名等)
333
333
 
334
334
  :param identifier: 要验证的标识符
335
+ :param is_database: 是否为数据库名,数据库名不能以数字开头
335
336
  :return: 清理后的安全标识符
336
337
  :raises ValueError: 当标识符无效时抛出
337
338
  """
@@ -349,9 +350,14 @@ class MySQLUploader:
349
350
  hash_suffix = hashlib.md5(identifier.encode('utf-8')).hexdigest()[:8]
350
351
  cleaned = f'unknown_col_{hash_suffix}'
351
352
 
352
- # 确保标识符不以数字开头(MySQL要求)
353
- if cleaned and cleaned[0].isdigit():
354
- cleaned = f'col_{cleaned}'
353
+ # 数据库名不能以数字开头(MySQL要求),但表名和列名可以
354
+ if is_database and cleaned and cleaned[0].isdigit():
355
+ cleaned = f'db_{cleaned}'
356
+ logger.warning('为数字开头的数据库名添加db_前缀', {
357
+ '原始标识符': identifier,
358
+ '清理后': cleaned
359
+ })
360
+
355
361
  mysql_keywords = {
356
362
  'select', 'insert', 'update', 'delete', 'from', 'where', 'and', 'or',
357
363
  'not', 'like', 'in', 'is', 'null', 'true', 'false', 'between'
@@ -379,7 +385,7 @@ class MySQLUploader:
379
385
  if time.time() - cached_time < self.metadata_cache_ttl:
380
386
  logger.debug('表存在缓存命中', {'库': db_name, '表': table_name, '存在': result})
381
387
  return result
382
- db_name = self._validate_identifier(db_name)
388
+ db_name = self._validate_identifier(db_name, is_database=True)
383
389
  table_name = self._validate_identifier(table_name)
384
390
  sql = """
385
391
  SELECT TABLE_NAME
@@ -413,7 +419,7 @@ class MySQLUploader:
413
419
  """
414
420
  创建数据表,优化索引创建方式
415
421
  """
416
- db_name = self._validate_identifier(db_name)
422
+ db_name = self._validate_identifier(db_name, is_database=True)
417
423
  table_name = self._validate_identifier(table_name)
418
424
  if not set_typ:
419
425
  logger.error('建表时未指定set_typ', {'库': db_name, '表': table_name})
@@ -859,7 +865,7 @@ class MySQLUploader:
859
865
  :return: 列名和数据类型字典 {列名: 数据类型}
860
866
  :raises: 可能抛出数据库相关异常
861
867
  """
862
- db_name = self._validate_identifier(db_name)
868
+ db_name = self._validate_identifier(db_name, is_database=True)
863
869
  table_name = self._validate_identifier(table_name)
864
870
  sql = """
865
871
  SELECT COLUMN_NAME, DATA_TYPE
@@ -885,7 +891,7 @@ class MySQLUploader:
885
891
  """
886
892
  确保某列有索引,如果没有则创建。
887
893
  """
888
- db_name = self._validate_identifier(db_name)
894
+ db_name = self._validate_identifier(db_name, is_database=True)
889
895
  table_name = self._validate_identifier(table_name)
890
896
  column = self._validate_identifier(column)
891
897
  # 检查索引是否已存在
@@ -914,7 +920,7 @@ class MySQLUploader:
914
920
  获取表中所有UNIQUE KEY的列组合(不含主键)。
915
921
  返回:[[col1, col2], ...]
916
922
  """
917
- db_name = self._validate_identifier(db_name)
923
+ db_name = self._validate_identifier(db_name, is_database=True)
918
924
  table_name = self._validate_identifier(table_name)
919
925
  sql = '''
920
926
  SELECT INDEX_NAME, COLUMN_NAME
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: mdbq
3
- Version: 4.0.63
3
+ Version: 4.0.64
4
4
  Home-page: https://pypi.org/project/mdbq
5
5
  Author: xigua,
6
6
  Author-email: 2587125111@qq.com
@@ -1,5 +1,5 @@
1
1
  mdbq/__init__.py,sha256=Il5Q9ATdX8yXqVxtP_nYqUhExzxPC_qk_WXQ_4h0exg,16
2
- mdbq/__version__.py,sha256=6Et4ZNNB7_Ld1K-A0R7SKzScGaPlzdt-ysSI2cj2u7E,18
2
+ mdbq/__version__.py,sha256=28iGEL7Adl8e67GFEMMy9IdHn8W84PuBf_O3pxCTG3M,18
3
3
  mdbq/log/__init__.py,sha256=Mpbrav0s0ifLL7lVDAuePEi1hJKiSHhxcv1byBKDl5E,15
4
4
  mdbq/log/mylogger.py,sha256=kPe3wsQNaB1slfX-Z7VMqzZoMoqPfc7ylYXZDBeFzzI,24945
5
5
  mdbq/myconf/__init__.py,sha256=jso1oHcy6cJEfa7udS_9uO5X6kZLoPBF8l3wCYmr5dM,18
@@ -9,7 +9,7 @@ mdbq/mysql/deduplicator.py,sha256=AB3gL7ZwhcmzGHSu4UY4M6YZVPFZ2wlAN3BCcwAhegQ,73
9
9
  mdbq/mysql/mysql.py,sha256=pDg771xBugCMSTWeskIFTi3pFLgaqgyG3smzf-86Wn8,56772
10
10
  mdbq/mysql/s_query.py,sha256=rSlAIUNfTrI25vYjoq9OpEbzsbrzc0m8mxb_0G7h878,45496
11
11
  mdbq/mysql/unique_.py,sha256=MaztT-WIyEQUs-OOYY4pFulgHVcXR1BfCy3QUz0XM_U,21127
12
- mdbq/mysql/uploader.py,sha256=sfgrHR3fKQ7ys-Y_cLCFBCFgwg3ZUL_fSJVu2suizOM,111658
12
+ mdbq/mysql/uploader.py,sha256=68kJIrCnP2dJZ6ilb8MoFzuzGGWU_272WwPfaqt075A,112125
13
13
  mdbq/other/__init__.py,sha256=jso1oHcy6cJEfa7udS_9uO5X6kZLoPBF8l3wCYmr5dM,18
14
14
  mdbq/other/download_sku_picture.py,sha256=X66sVdvVgzoNzmgVJyPtd7bjEvctEKtLPblEPF65EWc,46940
15
15
  mdbq/other/error_handler.py,sha256=4p5haAXSY-P78stp4Xwo_MwAngWYqyKj5ogWIuYXMeY,12631
@@ -22,7 +22,7 @@ mdbq/pbix/refresh_all.py,sha256=OBT9EewSZ0aRS9vL_FflVn74d4l2G00wzHiikCC4TC0,5926
22
22
  mdbq/redis/__init__.py,sha256=YtgBlVSMDphtpwYX248wGge1x-Ex_mMufz4-8W0XRmA,12
23
23
  mdbq/redis/getredis.py,sha256=vpBuNc22uj9Vr-_Dh25_wpwWM1e-072EAAIBdB_IpL0,23494
24
24
  mdbq/spider/__init__.py,sha256=RBMFXGy_jd1HXZhngB2T2XTvJqki8P_Fr-pBcwijnew,18
25
- mdbq-4.0.63.dist-info/METADATA,sha256=FrAiUp_WT-eGT8lzHZxw7jnAjeemU9nDFrQFDVg95Gg,364
26
- mdbq-4.0.63.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
27
- mdbq-4.0.63.dist-info/top_level.txt,sha256=2FQ-uLnCSB-OwFiWntzmwosW3X2Xqsg0ewh1axsaylA,5
28
- mdbq-4.0.63.dist-info/RECORD,,
25
+ mdbq-4.0.64.dist-info/METADATA,sha256=t1t2tnFWZqe2E2WspWa1zo6MMPMxQgHsxE7-50bvx8g,364
26
+ mdbq-4.0.64.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
27
+ mdbq-4.0.64.dist-info/top_level.txt,sha256=2FQ-uLnCSB-OwFiWntzmwosW3X2Xqsg0ewh1axsaylA,5
28
+ mdbq-4.0.64.dist-info/RECORD,,
File without changes