Gorm 默认值 零值 Default-Value Zero-Value

1,049 阅读1分钟

定义字段默认值

在 Gorm 框架中,可以使用标签(Tag)default 来指定字段的默认值,例如:

type User struct { 
    ID     int64 
    Name   string   `gorm:"default:galeone"` 
    Age    int64    `gorm:"default:18"` 
}

调用 db.Create 时,如果某字段是零值(Zero-value),Gorm 会使用字段中定义的 default 值进行缺省填充(构造 SQL)。

请注意:零值包括数字 0、空字符串 "",布尔值 false。

零值陷阱

定义了 default 值的字段,db.Create 时,零值不会被写入到 db 中(这种情况会使用 default 值)。为了避免这种情况,可以使用指针(pointer)或 Scanner/Valuer ,例如:

type User struct { 
    gorm.Model 
    Name string Age *int(这是一个指针类型) `gorm:"default:18"` 
    Active sql.NullBool `gorm:"default:true"` 
}

迁移时忽略 default 设置

对于在 db 中已经有了 default 值或设置了 virtual/generated value 的字段,你必须设置 default 标签。如果你想在 migrating 时跳过 default 值定义,你可以使用 default:(-),例如:

type User struct { 
    ID string `gorm:"default:uuid_generate_v3()"` // db func FirstName string LastName string 
    Age uint8 FullName string `gorm:"->;type:GENERATED ALWAYS AS (concat(firstname,' ',lastname));default:(-);"` 
}

当使用 virtual/generated value 时,你也许需要禁止字段的 creating/updating、check out Field-Level 权限。

参考文档

gorm.io/docs/create…