mysql_dao.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. from database import MySqlDatabaseHelper
  2. import json
  3. from database import CustConfig
  4. import numpy as np
  5. class MySqlDao:
  6. _instance = None
  7. def __new__(cls):
  8. if not cls._instance:
  9. cls._instance = super(MySqlDao, cls).__new__(cls)
  10. cls._instance._initialized = False
  11. return cls._instance
  12. def __init__(self):
  13. if self._initialized:
  14. return
  15. self.db_helper = MySqlDatabaseHelper()
  16. self._cust_table_name = "tads_brandcul_retail_cust_label" # 商户信息表
  17. self._analysis_table_name = "tads_brandcul_analysis_index" # 指标分析表
  18. self.cust_table_dao = self.CustTableDao(self.db_helper, self._cust_table_name)
  19. self._initialized = True
  20. class CustTableDao:
  21. """商户数据操作类"""
  22. def __init__(self, db_helper: MySqlDatabaseHelper, tablename):
  23. self.db_helper = db_helper
  24. self.tablename = tablename
  25. def load_data(self, features, corp_uuid):
  26. """读取商户数据"""
  27. features_column = ",".join(features)
  28. query = f"SELECT {features_column} FROM {self.tablename} WHERE corp_uuid = :corp_uuid"
  29. params = {"corp_uuid": corp_uuid}
  30. data = self.db_helper.load_data_with_page(query, params)
  31. return data
  32. def get_column_unique_value(self, column, corp_uuid):
  33. """获取指定列的唯一值列表"""
  34. query = f"SELECT {column} FROM {self.tablename} WHERE corp_uuid = :corp_uuid"
  35. params = {"corp_uuid": corp_uuid}
  36. data = self.db_helper.load_data_with_page(query, params)
  37. data = data[column].unique()
  38. # 将numpy array转换为Python列表,并确保所有元素都是Python原生类型
  39. if data is not None:
  40. # 处理numpy数据类型
  41. data = data.tolist()
  42. # 如果有numpy标量,转换为Python类型
  43. data = [self._convert_to_python_type(item) for item in data]
  44. return data
  45. def _convert_to_python_type(self, item):
  46. """将numpy/pandas类型转换为Python原生类型"""
  47. if isinstance(item, (np.integer, np.floating)):
  48. return item.item()
  49. elif isinstance(item, np.bool_):
  50. return bool(item)
  51. elif isinstance(item, np.ndarray):
  52. return item.tolist()
  53. else:
  54. return item
  55. if __name__ == '__main__':
  56. features = ["busi_place_area_section"]
  57. dao = MySqlDao()
  58. corp_uuid = "00000000000000000000000011440101"
  59. features = CustConfig.FEATURES_COLUMNS
  60. features_countent = {}
  61. for feature in features:
  62. features_countent[feature] = dao.cust_table_dao.get_column_unique_value(feature, corp_uuid)
  63. json_str = json.dumps(features_countent, indent=4, ensure_ascii=False)
  64. print(json_str)
  65. with open('./cust_features_map.json', 'w', encoding='utf-8') as file:
  66. file.write(json_str)