snake_case_util.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import re
  2. from sqlalchemy.engine.row import Row
  3. class SnakeCaseUtil:
  4. """
  5. 小驼峰形式(camelCase)转下划线形式(snake_case)工具方法
  6. """
  7. @classmethod
  8. def camel_to_snake(cls, camel_str):
  9. """
  10. 小驼峰形式字符串(camelCase)转换为下划线形式字符串(snake_case)
  11. :param camel_str: 小驼峰形式字符串
  12. :return: 下划线形式字符串
  13. """
  14. # 在大写字母前添加一个下划线,然后将整个字符串转为小写
  15. words = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', camel_str)
  16. return re.sub('([a-z0-9])([A-Z])', r'\1_\2', words).lower()
  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.camel_to_snake(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})