springbootAI 2.2.2__py3-none-any.whl → 2.2.4__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.
spring/orm/ddl_auto.py CHANGED
@@ -544,6 +544,9 @@ class DdlAutoManager:
544
544
  # @Transient 字段不持久化,跳过
545
545
  if _is_transient_field(cls, attr_name):
546
546
  continue
547
+ # 私有字段(以 _ 开头)不持久化,跳过
548
+ if attr_name.startswith('_'):
549
+ continue
547
550
  py_type = init_hints.get(attr_name) or cls_annotations.get(attr_name)
548
551
  # 解包 Optional[X]:Python 3.10 的 get_type_hints 会把带 None 默认值的
549
552
  # 参数注解自动包装为 Optional[X],3.11+ 不再包装。此处统一解包为承载类型,
@@ -1081,12 +1084,72 @@ class DdlAutoManager:
1081
1084
 
1082
1085
  # ==================== 装饰器API(便捷使用) ====================
1083
1086
 
1087
+ def _auto_infer_columns(cls):
1088
+ """扫描类型注解,为未显式赋 ``Column`` 描述符的字段自动创建 ``Column`` 实例。
1089
+
1090
+ 对齐 Java JPA:实体类中所有非 ``@Transient`` 字段自动映射为数据库列,
1091
+ 无需显式 ``= Column(...)`` 赋值。
1092
+
1093
+ 推断规则:
1094
+ - ``name: str`` → ``Column()``(无默认值,仅记录类型)
1095
+ - ``name: str = ""`` → ``Column(default="")``(赋值即为默认值)
1096
+ - ``name: int = 0`` → ``Column(default=0)``
1097
+ - ``name: str = Column(...)`` → 保留原 Column,不覆盖
1098
+ - ``name: int = Id()`` → 保留原 Id,不覆盖
1099
+ - 以 ``_`` 开头的字段 → 跳过(私有/内部字段)
1100
+ - ``@Transient`` 标记字段 → 跳过
1101
+ """
1102
+ # 收集 MRO 中所有类型注解
1103
+ all_annotations = {}
1104
+ for cls_base in reversed(cls.__mro__):
1105
+ base_anns = getattr(cls_base, '__annotations__', {})
1106
+ all_annotations.update(base_anns)
1107
+
1108
+ for attr_name in all_annotations:
1109
+ # 跳过私有字段
1110
+ if attr_name.startswith('_'):
1111
+ continue
1112
+ # 跳过 @Transient 字段
1113
+ if _is_transient_field(cls, attr_name):
1114
+ continue
1115
+
1116
+ # 查找 MRO 中最近的类属性值
1117
+ existing = None
1118
+ for cls_base in cls.__mro__:
1119
+ if attr_name in cls_base.__dict__:
1120
+ existing = cls_base.__dict__[attr_name]
1121
+ break
1122
+
1123
+ # 已有 Column/Id/Version/CreateTime/UpdateTime 描述符,不覆盖
1124
+ if isinstance(existing, Column):
1125
+ continue
1126
+ # 已有 @column 装饰器标记
1127
+ if hasattr(existing, '__column__'):
1128
+ continue
1129
+ # 已有 Transient 标记
1130
+ if isinstance(existing, Transient):
1131
+ continue
1132
+
1133
+ # 只有显式赋值才给默认值;无赋值则仅创建 Column() 记录类型
1134
+ if existing is not None and not callable(existing) \
1135
+ and not isinstance(existing, (classmethod, staticmethod)):
1136
+ col = Column(default=existing)
1137
+ else:
1138
+ col = Column()
1139
+
1140
+ setattr(cls, attr_name, col)
1141
+
1142
+
1084
1143
  def _auto_generate_init(cls):
1085
1144
  """为描述符风格实体类自动生成 ``__init__``(若类未显式声明)。
1086
1145
 
1087
- 扫描 MRO 中所有 ``Column`` 实例属性,生成关键字构造器。
1146
+ 先调用 ``_auto_infer_columns`` 补全类型注解对应的 ``Column`` 描述符,
1147
+ 再扫描 MRO 中所有 ``Column`` 实例属性,生成关键字构造器。
1088
1148
  若类已显式声明 ``__init__`` 则跳过,保持兼容。
1089
1149
  """
1150
+ # 无论是否有自定义 __init__,都先补全 Column 描述符(DDL 解析依赖)
1151
+ _auto_infer_columns(cls)
1152
+
1090
1153
  if '__init__' in cls.__dict__:
1091
1154
  return
1092
1155
  fields = {}
@@ -2,7 +2,7 @@
2
2
  PyMyBatis版本信息
3
3
  """
4
4
 
5
- __version__ = '2.2.2'
5
+ __version__ = '2.2.4'
6
6
  __author__ = 'PyMyBatis Team'
7
7
  __email__ = 'dev@pymybatis.org'
8
8
  __license__ = 'MIT'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: springbootAI
3
- Version: 2.2.2
3
+ Version: 2.2.4
4
4
  Summary: Spring-style Python framework with Web, ORM, Cloud and AI integrations
5
5
  Author-email: YuConggen <1516933915@qq.com>
6
6
  License-Expression: MIT
@@ -135,12 +135,12 @@ spring/monitoring/__init__.py,sha256=QGBmQligFNlz9xBm4mQp1FkIIkQGDIukQmpQVs4McLI
135
135
  spring/monitoring/prometheus.py,sha256=pLiTwPYvc53eRiZxGHKWnP9WZEAHj0VSPM3cLSbg9xs,6497
136
136
  spring/orm/__init__.py,sha256=cIueIxs9UAtp2240hWKrokstHzMBlrBKb3hVX1qbKRc,5632
137
137
  spring/orm/database.py,sha256=xM03ChDlvwfPgOUo6CcFORIq6Qk9pD89eMk2s7Q_9n4,7955
138
- spring/orm/ddl_auto.py,sha256=4sHeHlNmRiyuXrh1Zb0k6wNAJ3TdPJ7n3zQGlGSAkSc,63182
138
+ spring/orm/ddl_auto.py,sha256=1mDg4HAaokbUH7jMKF5hq0WD1pj6PkBKP3xoYIhfQTc,65729
139
139
  spring/orm/migration.py,sha256=ubQ8GEPSgpONzOPRJ7e98pZWIGMFLmKPKPKY33tJO1M,16814
140
140
  spring/orm/mybatis_integration.py,sha256=C3bFy8z9c1SNznaymFO7TpqQzt4cpVtEsR4SRp_ppPg,15319
141
141
  spring/orm/pymybatis/__init__.py,sha256=ULA6DPqgmA4VK8AdEYWFbkCjeBzL6PqqSN53Jmds-aY,3040
142
142
  spring/orm/pymybatis/configuration.py,sha256=IcmVp2BwgKBAq6tkTOOyy4wPa0I3a9GHjhkbHudoB5I,19842
143
- spring/orm/pymybatis/version.py,sha256=gpddYLHDsJi7AfqMfxQyU-uogf7QPbm0SWlMZ8Y1gjc,186
143
+ spring/orm/pymybatis/version.py,sha256=FB7XLPl1fufnouwrx_JI6JvUdaHpqbYv5LNfZfCl0OY,186
144
144
  spring/orm/pymybatis/annotations/__init__.py,sha256=EXMXFcpIYQMEV3IcU9ihAOi8X5hSl-vm37OrkLr0cxc,615
145
145
  spring/orm/pymybatis/annotations/annotations.py,sha256=_vXPspqUYUH3k0_i0TKLBdaHtOlR46ye7APFop9VQN8,10153
146
146
  spring/orm/pymybatis/cache/__init__.py,sha256=w6jSbefF2TvEbpMNSdWqJ2jrskkWbAfROKYScnKdzz0,974
@@ -218,9 +218,9 @@ spring/websocket/exceptions.py,sha256=5AdHUEPyCEl1fsgkbKyZtx7uA_FVWFa55orcv-t2mk
218
218
  spring/websocket/handler.py,sha256=CDkV4LAutg8w4Pc-ncSRrpWCygH0nXGGqaWRW-D3jpw,9537
219
219
  spring/websocket/router.py,sha256=GiDvhtIPThRZm3_DLsFcVf0WrFE0FJ0Y1CicTVvTjsU,21077
220
220
  spring/websocket/session.py,sha256=zgfX8Q_gNe_8SLbNCSItfYkPlj0UoGq5Rtl8K1AFf2E,7398
221
- springbootai-2.2.2.dist-info/licenses/LICENSE,sha256=KbrOVY95QmE6yjybENCP50F5dsNPvG6s6i9Z3uaWV5A,899
222
- springbootai-2.2.2.dist-info/METADATA,sha256=ed9xfQzlrzTXX6Y8rN-vPisiZF9VnID4I_KTyOWl6-8,70779
223
- springbootai-2.2.2.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
224
- springbootai-2.2.2.dist-info/entry_points.txt,sha256=TNfwGO69hnbtNod1kUbpU8jck_XYTgK1V8UJv8n5Ros,53
225
- springbootai-2.2.2.dist-info/top_level.txt,sha256=x-VGAed_KxOzDuurInGOuLKDUiWFEvCGBrF-m_aHw2Q,7
226
- springbootai-2.2.2.dist-info/RECORD,,
221
+ springbootai-2.2.4.dist-info/licenses/LICENSE,sha256=KbrOVY95QmE6yjybENCP50F5dsNPvG6s6i9Z3uaWV5A,899
222
+ springbootai-2.2.4.dist-info/METADATA,sha256=-ElD-Ro1bwKumfMy5TEVFvlu4Qcpp86fGAF5cAHFBWQ,70779
223
+ springbootai-2.2.4.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
224
+ springbootai-2.2.4.dist-info/entry_points.txt,sha256=TNfwGO69hnbtNod1kUbpU8jck_XYTgK1V8UJv8n5Ros,53
225
+ springbootai-2.2.4.dist-info/top_level.txt,sha256=x-VGAed_KxOzDuurInGOuLKDUiWFEvCGBrF-m_aHw2Q,7
226
+ springbootai-2.2.4.dist-info/RECORD,,