feat: 支持 Option<T> 字段(None↔NULL)、列命名默认原样(Keep)、迁移同名列先删后加,版本 1.1.0

This commit is contained in:
2026-08-21 03:41:53 +08:00
parent 132aae865b
commit 394c4a1fb5
14 changed files with 335 additions and 87 deletions
+6 -5
View File
@@ -171,7 +171,8 @@ main() {
生成规则与限制(v1):
- **初始**`initial(id, desc, models)` → 每个模型一张 `CreateTable``down` 为逆序 `DropTable`
- **增量**`diff(id, desc, oldModels, newModels)` → 新增表 `CreateTable`、删除表 `DropTable`、列增删改(`AddColumn`/`DropColumn`/`AlterColumn`),`down` 自动按 up 逆序反转;
- 字段类型 → 列类型映射:`String→TextCol``Bool→BoolCol``Int8/16/32/64→Tiny/Small/Int/BigIntCol``Float32→RealCol``Float64→FloatCol``DateTime→DateTimeCol``Decimal→DecimalCol``Array<Byte>→BinaryCol``Rune→IntCol``Duration→BigIntCol`
- **同名列修改数据结构**`Migrator` 执行 `AddColumn`/`AlterColumn` 前先查 `information_schema`,若库中已有同名列且类型与目标不一致,则**先 `DROP COLUMN``ADD COLUMN`**(重建该字段);类型一致时 `AddColumn` 幂等跳过、`AlterColumn` 正常执行(处理非空/长度等变化)
- 字段类型 → 列类型映射:`String→TextCol``Bool→BoolCol``Int8/16/32/64→Tiny/Small/Int/BigIntCol``Float32→RealCol``Float64→FloatCol``DateTime→DateTimeCol``Decimal→DecimalCol``Array<Byte>→BinaryCol``Rune→IntCol``Duration→BigIntCol``Option<X>` 按内层类型 X 映射且列可空(`None``NULL`);
- **不支持**(抛异常提示手写迁移):主键列名变更、主键/自增属性变更;模型无索引注解,不生成索引;`@Ignore`/`@Column`/`@Required`/`@MaxLength`/`@AutoIncrement` 均会反映到 DDL。
### 迁移 CLI(对齐 dotnet ef
@@ -267,13 +268,13 @@ orm-cj/
### 2. 模型映射约定(对齐 EF Core 数据模型)
- **表名**`@Table` 优先,否则类简单名;
- **列名**`@Column` 优先,否则按 `ColumnNamingPolicy`(默认 `StripUnderscore``_id``id``id` 原样;可切换 `SnakeCase``userName``user_name``Keep` 原样);
- **主键**`@Key` 标注,或字段名 `_id` / `id`v1 仅支持**单主键**
- **列名**`@Column` 优先,否则按 `ColumnNamingPolicy`(默认 **`Keep`**:字段名原样即列名,不做任何转换;可切换 `SnakeCase``userName``user_name``StripUnderscore``_id``id`);
- **主键**`@Key` 标注,或字段名 `id`v1 仅支持**单主键**
- **自增**`@AutoIncrement`,或整型(Int8-64`id` 主键默认自增;INSERT 跳过该列并通过 `RETURNING` 回读;
- **客户端生成主键**`String` 主键默认客户端生成(`GuidUtil`:时间戳 + 自增序号 hex),INSERT 时为空自动生成;
- **实体要求**:字段必须是 `public var` 标量类型,且提供无参 `public init()`
支持的字段标量类型:`String` / `Bool` / `Int8~Int64` / `UInt8~UInt64` / `Float32` / `Float64` / `Rune` / `DateTime` / `Duration` / `Decimal` / `Array<Byte>`
支持的字段标量类型:`String` / `Bool` / `Int8~Int64` / `UInt8~UInt64` / `Float32` / `Float64` / `Rune` / `DateTime` / `Duration` / `Decimal` / `Array<Byte>`,以及上述类型的 **`Option<T>` 包装**`None``NULL`DDL 列可空)
### 3. DbContext / DbSet(对齐 EF Core
@@ -382,7 +383,7 @@ cjpm test # 纯逻辑单元测试(模型映射/SQL 生成/DDL 生成/QueryB
- **cjc 1.1.3 编译器缺陷(重要)**:类上带 `@Table[...]` 注解时,若成员变量带 ≥2 个注解且用 `= ""` 做空字符串初始化(如 `@Required @MaxLength[100] public var x: String = ""`),编译报 `expected expression after '=', found '<EOF>'`。规避:默认值改用 `= String()` 或直接省略初始化器。`orm-cj` 包内代码与 e2e 示例均按此规避写法;
- **仅单主键**;不支持复合主键;
- **不支持 Option 字段**`?String`请改用具体标量类型)与**父类字段**(不扫描继承字段);
- **Option<T> 字段已支持**`?String`可空字段 `None ↔ NULL`(详见「模型映射约定」);**父类字段暂不支持**(不扫描继承字段);
- 不支持导航属性 / 延迟加载 / 级联删除(对齐 EF Core 这些能力属于 v2+);
- 不支持 LINQ 表达式树,查询以 `filter` 条件方法 + SQL 片段组合;
- `QueryBuilder` 的 SQL 片段形式(`filter(condition, params)`)需自行保证列名合法(会做标识符引号包裹校验外的处理)——推荐优先使用三参属性形式;