buffalo项目数据库迁移必须使用soda cli:用buffalo pop generate fizz生成带时间戳前缀的.up.fizz文件,以soda migrate up -d -e development预览sql,再用soda migrate up -e development执行,回滚则用soda migrate down -e development,且需手动编写对应.down.fizz文件。

Buffalo 项目里迁移数据库不能只靠 buffalo db migrate,它不支持预览、不支持回滚、也不显示 SQL——真正干活的是底层 soda CLI。你得切到 soda 才能控制迁移全过程。
生成迁移文件必须用 buffalo pop generate fizz
别手写 .fizz 文件,也别复制旧文件改名。时间戳是 soda 排序的唯一依据,错一位就乱序或跳过:
-
buffalo pop generate fizz create_posts生成类似20260923110601_create_posts.up.fizz的文件 - 打开 .up.fizz,补全表结构;Fizz 默认加
id、created_at、updated_at,想禁用得显式调t.DisableTimestamps() - 外键列(如
user_id)要先t.Column()再t.ForeignKey(),否则迁移执行时报错
执行前务必用 soda migrate up -d -e development 预览 SQL
直接 soda migrate up -e development 会立刻执行,没机会检查语句是否符合预期。预览命令才是安全前提:
-
-d表示 dry-run,只输出 SQL,不连数据库、不改 schema - 若
database.yml里缺development:块,soda会静默 fallback 到test环境,可能误刷测试库 - PostgreSQL 用户注意:自增字段必须显式加
{"auto_increment": true},否则建表失败
回滚只能用 soda migrate down -e development
buffalo db rollback 是个假命令,实际调用的还是 soda;但 soda 不会自动生成 down 逻辑,全靠你手写:
- 迁移文件必须同时有
.up.fizz和.down.fizz,否则down直接报错退出 - 想回退多步,要么重复执行
soda migrate down -e development,要么用-t 20260923110601指定时间戳——注意是“大于等于”,不是“等于” -
soda migrate status -e development要先跑一遍,确认目标时间戳确实在 applied 列表里,否则-t会静默跳过,你以为回滚了,其实什么都没做
database.yml 配置错一个字段,迁移就卡在连接拒绝
迁移失败最常见原因不是语法错误,而是根本连不上库。检查点必须逐项核对:
-
dialect必须小写且拼写准确:"postgres"✅,"postgresql"❌,"pg"❌ - MySQL 的
host写"127.0.0.1",别写"localhost",否则可能走 Unix socket 导致路径解析失败 - PostgreSQL 默认端口是
5432,MySQL 是3306,用telnet localhost 5432确认端口通不通,不通就别折腾配置了 - 执行
buffalo pop create -a成功后,再跑soda migrate up -e development,否则表都不存在,迁移自然失败
迁移不是一次性的操作,而是持续伴随开发的过程。最容易被忽略的是:每次生成新迁移前,先确认 migrations/ 下没有未提交的 .fizz 文件;一旦时间戳重复或顺序错乱,soda 就无法可靠判断该执行哪一步。











