buffalo不支持生成完全空白的迁移文件,正确命令是buffalo g migration --sql adduserstable,生成含-- +goose up/down注释头、中间留空的sql文件,符合goose解析要求。

buffalo g migration 生成空迁移文件的正确命令
Buffalo 不支持直接生成“空”迁移文件(即不含 SQL 的 .sql 文件),buffalo g migration 命令默认会生成带 up 和 down 函数体的 Go 文件(如 xxx_add_column_to_users.go),而非纯 SQL 迁移。如果你需要手动写 SQL,得用 --sql 标志强制生成 .sql 文件——但它仍会带基础模板结构,不是真正“空”的。
-
buffalo g migration --sql AddUsersTable→ 生成xxx_add_users_table.sql,内容含-- +goose Up和-- +goose Down注释块,但中间是空行,可手写 SQL -
buffalo g migration CreateUser→ 生成xxx_create_user.go,含func Up/Down空函数体,适合用 pop ORM 写代码逻辑 - 不加
--sql时,即使函数体为空,文件也含 import、package、struct 定义等 boilerplate,不是“空文件”
为什么不能生成完全空白的 .sql 文件
Buffalo 的迁移系统基于 github.com/pressly/goose(v3+ 版本),它要求每个 .sql 文件必须包含 -- +goose Up 和 -- +goose Down 注释头,否则 buffalo db migrate 会报错:failed to parse migration: missing +goose Up directive。所谓“空”,只是指 SQL 语句部分为空,注释头不可删。
- 手动删掉注释头 → 运行
buffalo db migrate直接 panic - 保留注释头但中间留空 → 迁移会执行成功(Up/Down 各执行一条空语句),但无实际效果
- 若想跳过执行,应改用
buffalo db migrate up 0回退到初始状态,而非依赖空文件
生成后怎么安全修改迁移内容
生成的文件默认放在 migrations/ 目录下,名字带时间戳前缀(如 20260920191422_add_users_table.sql)。修改前需确认:
- 该迁移尚未被应用:运行
buffalo db status查看applied列是否为false - SQL 文件中只写标准兼容语句:PostgreSQL 用户避免
IF NOT EXISTS(某些版本不支持),MySQL 用户注意引号和反引号用法 - 不要重命名或移动已生成的迁移文件:Buffalo 依赖时间戳排序,乱序会导致
up失败 - 修改后务必用
buffalo db migrate up测试,别只靠 eyeball 检查
替代方案:跳过 buffalo g,手建合规 .sql 文件
如果只是要一个最小可用的 SQL 迁移模板,最稳的方式是跳过 buffalo g,直接在 migrations/ 下新建文件:
Buffalo框架 1.0.1 版本源码包下载,适合需要错误处理改进、依赖更新、render.Download 注释和 request logger 调整的 v1 项目。
touch migrations/$(date -u +%Y%m%d%H%M%S)_empty_stub.sql
然后填入:
-- +goose Up -- SQL in section 'Up' is executed when this migration is applied SELECT 'stub migration'; <p>-- +goose Down -- SQL in section 'Down' is executed when this migration is rolled back SELECT 'rollback stub';</p>
这样既满足 goose 解析要求,又保持内容可控。注意:所有 SQL 行必须以 -- 或 SELECT/CREATE 等关键字开头,不能有空行夹在两个 -- +goose 块之间。
时间戳格式必须严格为 YYYYMMDDHHMMSS,否则 buffalo db migrate 会忽略该文件。Windows 用户请用 pwsh 或 git-bash 执行 date 命令,CMD 不支持该格式。










