buffalo模型字段必须同时标注json和db标签,主键需显式声明primarykey,时间戳用time.time并指定db列名,可空字段须用指针类型。

在Buffalo框架中定义模型结构体时,必须正确添加结构体字段标签,否则数据库迁移会失败或数据无法正确读写,因为Buffalo依赖encoding/json和github.com/gobuffalo/pop/v6进行序列化与ORM映射。
基础字段标签:json + db
每个导出字段(首字母大写)都必须同时声明json和db两个标签。
第一步:用json:"field_name"指定JSON序列化键名,必须小写且带引号;不加该标签会导致HTTP响应中字段为空或忽略。
第二步:用db:"field_name"指定数据库列名,值需与数据库实际字段名完全一致(包括大小写、下划线);若省略,Pop默认使用驼峰转蛇形,但极易出错——比如CreatedAt会被转成created_at,而你建表时若手写为created_at_time,就完全对不上。
第三步:组合写法示例:Name string `json:"name" db:"name"`。这一步不能只写一个标签,【json和db标签缺一不可】。
主键与时间戳字段的特殊处理
Buffalo约定主键字段名为id,类型必须为uuid.UUID或int,且需显式标注db:"id,primarykey"。
Buffalo框架 1.0.1 版本源码包下载,适合需要错误处理改进、依赖更新、render.Download 注释和 request logger 调整的 v1 项目。
方法一:使用UUID主键(推荐)ID uuid.UUID `json:"id" db:"id,primarykey"`
注意:若未安装github.com/google/uuid并正确导入,编译会报错。
方法二:使用自增整数主键ID int `json:"id" db:"id,primarykey,autoincrement"`
这要求数据库表定义中该列为SERIAL(PostgreSQL)或AUTO_INCREMENT(MySQL)。
时间戳字段必须用time.Time类型,并标注db:"created_at"或db:"updated_at";Buffalo不会自动填充它们——除非你在模型中嵌入pop.Model并启用钩子。
可空字段与零值控制
数据库中允许NULL的字段,在Go结构体中应使用指针类型,例如*string、*int、*time.Time。
Notes *string `json:"notes" db:"notes"`
这样当传入JSON中"notes": null或字段缺失时,Pop才会写入NULL;若用string类型,空字符串""将被写入数据库,无法表达“无值”语义。
布尔字段若需区分“未设置”和“false”,也必须用*bool;直接写bool会导致所有未传值字段被强制设为false,且无法回溯原始状态。










