camel_case_util.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. from sqlalchemy.engine.row import Row
  2. class CamelCaseUtil:
  3. """
  4. 下划线形式(snake_case)转小驼峰形式(camelCase)工具方法
  5. """
  6. @classmethod
  7. def snake_to_camel(cls, snake_str):
  8. """
  9. 下划线形式字符串(snake_case)转换为小驼峰形式字符串(camelCase)
  10. :param snake_str: 下划线形式字符串
  11. :return: 小驼峰形式字符串
  12. """
  13. # 分割字符串
  14. words = snake_str.split('_')
  15. # 小驼峰命名,第一个词首字母小写,其余词首字母大写
  16. return words[0] + ''.join(word.capitalize() for word in words[1:])
  17. @classmethod
  18. def transform_result(cls, result):
  19. """
  20. 针对不同类型将下划线形式(snake_case)批量转换为小驼峰形式(camelCase)方法
  21. :param result: 输入数据
  22. :return: 小驼峰形式结果
  23. """
  24. if result is None:
  25. return result
  26. # 如果是字典,直接转换键
  27. elif isinstance(result, dict):
  28. return {cls.snake_to_camel(k): v for k, v in result.items()}
  29. # 如果是一组字典或其他类型的列表,遍历列表进行转换
  30. elif isinstance(result, list):
  31. return [
  32. cls.transform_result(row)
  33. if isinstance(row, (dict, Row))
  34. else (
  35. cls.transform_result({c.name: getattr(row, c.name) for c in row.__table__.columns}) if row else row
  36. )
  37. for row in result
  38. ]
  39. # 如果是sqlalchemy的Row实例,遍历Row进行转换
  40. elif isinstance(result, Row):
  41. return [
  42. cls.transform_result(row)
  43. if isinstance(row, dict)
  44. else (
  45. cls.transform_result({c.name: getattr(row, c.name) for c in row.__table__.columns}) if row else row
  46. )
  47. for row in result
  48. ]
  49. # 如果是其他类型,如模型实例,先转换为字典
  50. else:
  51. return cls.transform_result({c.name: getattr(result, c.name) for c in result.__table__.columns})