buffalo框架用go struct+struct tag定义数据库模型字段,struct需导出并嵌入buffalo.model;db tag控制数据库映射(如主键、null),json tag控制序列化,valid tag声明验证规则但需手动触发。

Buffalo 框架里模型字段定义在 models/ 目录下的 struct 中
Buffalo 默认用 Go 的 struct + struct tag 来定义数据库模型字段,不是通过 DSL 或配置文件。字段名、类型、数据库映射、验证规则都写在 struct 字段的 tag 里。
典型位置是 models/user.go 或类似路径,struct 必须导出(首字母大写),且需包含 buffalo.Model 嵌入字段(或实现对应接口)才能被 ORM 识别。
-
jsontag 控制序列化行为,不影响数据库 -
dbtag 控制列名、是否主键、是否允许 NULL 等,例如db:"id,primarykey" -
validtag 写验证规则,如valid:"required,email" - 字段类型必须是 Go 原生类型或
time.Time、uuid.UUID等 ORM 支持的类型
db tag 常见值及其实际效果
Buffalo 使用 Pop(底层是 SQLx + database/sql)做 ORM,db tag 是它解析字段与数据库列映射的核心依据。不写 db tag 的字段默认不会映射到数据库。
-
db:"id,primarykey":声明主键,自增(PostgreSQL 需配合serial类型) -
db:"name,null":允许 NULL;省略则默认 NOT NULL(除非类型是 pointer,如*string) -
db:"created_at,datetime":自动填充时间戳(需配合timestamps: true在 migration 或 model hook 中启用) -
db:"status,enum=active,inactive":仅限 PostgreSQL,生成ENUM类型列 -
db:"-":完全忽略该字段,不参与数据库操作(适合只用于 API 返回的计算字段)
字段类型选 pointer 还是值类型?关键看是否允许 NULL
Go 的零值语义和 SQL 的 NULL 不同,Buffalo 不会自动把零值转为 NULL —— 它严格按 Go 类型判断是否可空。
Buffalo框架 1.0.1 版本源码包下载,适合需要错误处理改进、依赖更新、render.Download 注释和 request logger 调整的 v1 项目。
- 用
string:字段非 NULL,插入时若未赋值会存空字符串"" - 用
*string:字段可 NULL,未赋值时数据库写入NULL;读取时若数据库为 NULL,则指针为nil - 同理,
intvs*int、boolvs*bool行为一致 -
time.Time无法表示 NULL,必须用*time.Time才能存 NULL 时间
常见错误:CreatedAt time.Time `db:"created_at,datetime"` 导致迁移失败或插入报错,因为 time.Time{} 是零值,某些驱动拒绝插入;应改用 *time.Time 并配合钩子自动赋值。
验证规则写在 valid tag 里,但不自动触发
valid tag 只是声明规则,Buffalo 不会在 Save 前自动调用验证。必须显式调用 model.ValidateAndSave(tx) 或手动调用 model.Validate()。
-
valid:"required":字段非零值(""、0、nil等均视为无效) -
valid:"email":仅校验格式,不发邮件也不查域名 -
valid:"min:3,max:20":适用于string和数字类型 - 自定义验证需注册函数,不能只靠 tag 实现
容易忽略的一点:验证失败返回的是 validation.Errors 类型,不是 error,直接 if err != nil 会漏判;要用 if errors.HasAny() 判断。










