buffalo db generate migration 会在 models/migrations/ 下生成一对带时间戳的 go 文件:xxx.up.fizz(升级)和 xxx.down.fizz(回滚),默认使用 fizz dsl;加 --sql 则生成 .up.sql/.down.sql。

buffalo db generate migration 会创建什么文件
执行 buffalo db generate migration 命令后,Buffalo 会在 models/migrations/ 目录下生成一对 Go 文件:一个以 up 结尾(用于迁移升级),一个以 down 结尾(用于回滚)。文件名带时间戳前缀,例如 20240515102345_add_users_table.up.fizz 和 .down.fizz。
默认使用 Fizz 语法(非 SQL),因为 Buffalo 的 pop ORM 内置了跨数据库兼容的 DSL。如果你习惯写原生 SQL,可以加 --sql 标志,生成 .up.sql 和 .down.sql 文件。
- 不加参数 → 生成
.up.fizz/.down.fizz -
--sql→ 生成.up.sql/.down.sql -
--description="add email to users"→ 文件名含描述,更易识别
Fizz 语法里怎么写添加字段或建表
Fizz 不是 SQL,但语义清晰。比如加一张 users 表,.up.fizz 写:
create_table("users", func(t *Table) {
t.Column("id", "uuid", {"primary": true})
t.Column("email", "string", {"null": false})
t.Column("created_at", "timestamp", {})
t.Column("updated_at", "timestamp", {})
})
对应 .down.fizz 就是 drop_table("users")。注意:t.Column("email", "string") 中的 "string" 是 Pop 的类型映射(PostgreSQL 对应 text,SQLite 对应 TEXT),不是 Go 类型。
- 字段名必须用双引号包裹,如
"email",否则解析失败 -
{"null": false}表示非空,省略则默认允许 NULL - 主键不叫
id SERIAL PRIMARY KEY,而是用{"primary": true} - 别在 Fizz 里写
NOT NULL DEFAULT NOW()—— Fizz 不支持复合约束,得用--sql或后续手动补
运行迁移时提示 “no migrations to run” 怎么办
常见原因不是命令没输对,而是 Buffalo 默认只找已标记为“已执行”的迁移之后的文件。它通过 schema_migrations 表记录状态。如果刚初始化项目却提示无迁移可跑,大概率是:
Buffalo框架 1.0.1 版本源码包下载,适合需要错误处理改进、依赖更新、render.Download 注释和 request logger 调整的 v1 项目。
-
buffalo db create没执行,数据库本身不存在 -
buffalo db migrate找不到models/models.go中配置的Pop连接(检查database.yml是否有误、环境变量GO_ENV是否匹配) - 迁移文件放在了
models/migrations/外的路径(Buffalo 不扫描子目录) - 文件后缀不是
.up.fizz或.up.sql(大小写敏感,.UP.FIZZ无效)
调试建议:先运行 buffalo db migrate -d(debug 模式),看它实际加载了哪些文件;再查 schema_migrations 表是否存在、是否为空。
迁移文件写错后能直接改再重跑吗
不能。Buffalo 的 buffalo db migrate 是单向推进的,不会重新执行已记录的迁移 ID。改完 .up.fizz 后再跑,它会跳过——因为 ID 已存在 schema_migrations 表中。
正确做法分两种场景:
- 刚生成、还没运行过 → 直接删掉那对文件,重新
generate - 已执行且出错了 → 先
buffalo db migrate down 1回滚最后一条,再改文件,再up;如果down本身也写错了,就得手动进数据库修复,然后删schema_migrations里对应行(高风险,仅开发环境)
真正容易被忽略的是:Fizz 的 down 必须逻辑上可逆。比如 add_column("users", "age", "int") 的 down 应该是 drop_column("users", "age"),而不是留空或写错表名——这种错误只有在 migrate down 时才暴露,但那时可能已影响其他开发者。










