buffalo g model仅生成模型结构体、测试桩和空actions文件,不生成迁移文件;必须额外执行buffalo g migration创建Fizz格式迁移文件才能建表。

buffalo g model 只生成结构体和测试桩,不生成迁移文件——必须额外运行 buffalo g migration 才能建表。
buffalo g model 命令实际做了什么
它只在 models/ 下创建 Go 结构体(如 user.go)和空测试文件(user_test.go),同时在 actions/ 里加一个空的 users.go(仅含包声明)。不会碰数据库、不写迁移、不注册路由。
- 字段名带下划线(如
first_name:string)会自动转成 PascalCase 字段名 +db:"first_name"tag - 字段类型靠后缀识别:
email:string→ TEXT;age:int→ INTEGER;active:bool→ BOOLEAN - 时间字段只有命名为
created_at或updated_at才会被 pop 自动处理,否则只是普通time.Time - 主键不会自动生成:
id字段必须手动加db:"id,primarykey",否则tx.Create()会 panic
为什么执行了 buffalo g model 却没表?
因为迁移文件根本没生成。常见错误操作是以为命令已“完成建模”,结果 buffalo db migrate 报错 no migration files found。
- 必须紧接着再跑一次:
buffalo g migration CreateUsers(名字任意,但建议匹配模型) - 生成的文件是
models/migrations/xxx_create_users.up.fizz,不是.sql—— 改后缀会导致buffalo db migrate忽略它 -
.up.fizz里默认所有字段都带{"null": true},真实项目中邮箱、用户名等通常要{"null": false, "unique": true} - SQLite 不支持列级
unique,必须显式加t.Index("email", {"unique": true})才生效
字段约束和类型怎么补?
CLI 不支持直接声明 NOT NULL、UNIQUE、INDEX 或长度限制,全靠手动改 .up.fizz 文件。
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
立即学习“go语言免费学习笔记(深入)”;
-
string默认映射为 TEXT(非 VARCHAR),若需 255 限制,得把t.Column("name", "string", {})改成t.Column("name", "varchar", {"size": 255}) -
int是有符号整型;要无符号需写uint,但 pop 不原生支持,得手写 SQL 片段 - 外键字段(如
author_id:int)不会自动建约束,必须在.up.fizz里加t.ForeignKey("author_id", "users", {"on_update": "NO ACTION", "on_delete": "NO ACTION"}) - 复合类型(如 JSON)不被 CLI 识别,
data:json会报错,得用data:text占位,再手动改成jsonb(PostgreSQL)或json(MySQL)
生成后必须立刻检查的三处
多数 DB panic 和字段查不到问题,都出在这三个地方没核对:
-
models/user.go里每个字段是否都有db:"xxx"tag?Pop 默认不按字段名映射列名 -
models/migrations/*_create_users.up.fizz是否真包含你声明的字段?Fizz 语法括号错位会导致 migrate 静默失败 -
models/user.go的TableName()方法是否返回正确表名?默认是复数小写("users"),但如果你用的是大写或前缀,必须重写
最容易被忽略的是:CLI 从不帮你写 CreatedAt/UpdatedAt 的初始化逻辑,也不设默认值。这些得靠 pop 的钩子(BeforeCreate 等)或数据库层面 default 补全。

















