Buffalo G model字段类型需按约定选择:string→VARCHAR(255),int→INTEGER,time.Time需显式db:"created_at:datetime",bool→TINYINT(1)(建议手动改为BOOLEAN),float64→DOUBLE(金额用decimal:10,2),JSONB需显式jsonb:jsonb。

buffalo g model 生成模型时字段类型怎么选
Buffalo 的 buffalo g model 命令会直接映射到 GORM 字段标签和数据库列类型,不是所有 Go 类型都支持自动推导。比如 string 对应 VARCHAR(255),int 默认是 INTEGER(非 INT64),而 time.Time 必须显式声明为 created_at:datetime 才能被识别为时间戳字段。
常见踩坑点:
-
bool字段在迁移中生成的是 TINYINT(1),但 MySQL 8.0+ 推荐用 BOOLEAN;如需兼容,手动改 migration 文件里的db.ColumnType("boolean") -
float64会被转成 DOUBLE,若需精度控制(如金额),应改用decimal:10,2 - 自定义类型(如 JSONB)必须用
jsonb:jsonb显式标注,否则按 TEXT 处理
模型结构体命名和字段 tag 必须严格匹配约定
Buffalo 要求模型结构体名必须是单数、大驼峰(如 User),且文件名与结构体名一致(models/user.go)。字段名首字母必须大写(即 exported),否则 GORM 无法反射读取;同时 db tag 是唯一生效的映射依据。
示例错误写法:Name string `json:"name"` —— 缺少 db:"name",迁移不会建列,运行时也查不到数据。
正确写法:Name string `json:"name" db:"name"`,或更安全地加上 notnull:Email string `json:"email" db:"email notnull unique"`。
迁移文件时间戳不可手动修改,否则 buffalo db migrate 会乱序
执行 buffalo db generate model user ... 后生成的迁移文件名形如 20260923152234_create_users.up.fizz,前面的时间戳决定执行顺序。一旦你重命名或修改时间部分,buffalo db migrate 就可能跳过某些迁移、重复执行、甚至报错 “migration already applied”。
Buffalo框架 1.0.1 版本源码包下载,适合需要错误处理改进、依赖更新、render.Download 注释和 request logger 调整的 v1 项目。
如果真要调整顺序(比如补一个前置字段),唯一安全做法是:
- 删掉已生成但未执行的迁移文件
- 用
buffalo db generate fizz add_name_to_users新建一个带新时间戳的迁移 - 在 fizz 语法里写
add_column("users", "name", "string")
别碰旧文件名里的数字。
模型测试桩 models/user_test.go 需要手动补初始化逻辑
buffalo g model 生成的 models/user_test.go 只有空壳,不包含 DB 连接、表创建或样例数据。直接跑 go test 会 panic:database is closed。
必须在测试函数开头加:
func TestUser(t *testing.T) {
if !pop.TestMode {
t.Skip("This test requires pop.TestMode to be set")
}
tx, err := models.Transaction()
assert.NoError(t, err)
defer tx.Close()
// 此处插入测试数据
u := &models.User{Name: "test", Email: "t@example.com"}
assert.NoError(t, tx.Create(u))
}
否则所有模型测试都过不了——这个细节文档几乎不提,但实际开发中第一轮测试必卡这里。
Buffalo 的模型设计不是写完 struct 就完事,它把命名、tag、迁移时机、测试初始化全串在一起,漏掉任意一环都会导致运行时报错而非编译报错,调试时容易往错方向查。

















