Buffalo 的 buffalo pop generate sql --name xxx 是唯一能从现有数据库反向生成纯表结构迁移文件的命令,它仅读取元信息(如 information_schema),输出不含 INSERT/COPY/VALUES 的 DDL SQL,且必须指定 --name 参数,生成路径为 models/migrations/,后缀为 .sql。

Buffalo 的数据库迁移不是“写完文件就跑”,而是严格依赖命名、DSL 语法和执行链路;表结构导出也不靠 pop dump,得用原生命令或 generate sql。
buffalo pop generate sql 怎么只导出表结构
这是唯一能从现有数据库反向生成纯 DDL 迁移文件的 Buffalo 命令。它不读数据行,只查 information_schema 或 pg_tables 元信息,输出不含 INSERT、COPY 或 VALUES 的 SQL。
-
--name参数必须提供,否则命令失败;生成路径固定为models/migrations/ - 生成的文件后缀是
.sql,不是.fizz,且内容全是CREATE TABLE、ADD CONSTRAINT类语句 - 若 database.yml 中
development配置错误,命令会连不上库并报错failed to connect to database,不会静默跳过 - 别指望
buffalo pop dump --schema-only:pop 库压根没实现这个子命令,官方明确建议用pg_dump -s或mysqldump --no-data替代
soda migrate up -e development 为什么没反应或报错
根本原因不是命令写错,而是 soda 不读 database.yml,只认环境变量或 models.NewDB() 返回的硬编码连接。你改了 YAML 却没动 Go 代码,迁移必然失效。
- 检查
models/database.go中NewDB()是否返回了正确 dialect 和参数(比如 PostgreSQL 必须含sslmode=disable) - 临时验证可加前缀:
DB_URL=postgres://localhost:5432/myapp?sslmode=disable soda migrate up -e development - SQLite 完全不可用:pop v6+ 已移除驱动注册,即使配置
dialect: sqlite3或DB_URL=sqlite3://./dev.sqlite,也会在初始化阶段 panic - 执行前必须已建库:
soda migrate up不创建数据库本身,只建表;若库不存在,会卡住或报database "myapp" does not exist
Fizz 迁移文件里怎么写非空 + 唯一字段
Fizz 是抽象 DSL,不是 SQL 模板。字段修饰符必须用 map 语法,且类型名只能是抽象名(如 "string"),不能写 "VARCHAR(255)"。
- 非空 + 唯一要写成:
t.Column("email", "string", {{"null", false}, {"unique", true}})—— 注意是{{"null", false}},不是{"null": false}或null: false - 主键必须显式声明:
t.Column("id", "uuid", {"primary": true}),否则默认仍是integer,跨数据库行为不一致 - 外键需两步:先定义字段(如
t.Column("user_id", "uuid", {})),再调t.ForeignKey("user_id", "users", {"on_delete": "cascade"}) - 添加非空字段到已有数据表时,直接设
{"null", false}会失败;应分三步:add_column→exec("UPDATE ...")补默认值 →alter_column(..., {"null", false})
buffalo db migrate 和 soda migrate 的区别在哪
buffalo db migrate 是高层封装,静默运行、无法预览 SQL、不支持回滚到指定版本;soda migrate 是底层 CLI,开发调试必须用它。
-
soda migrate up -d -e development可预览将执行的 SQL(不连库、不修改数据),适合检查语义是否符合预期 -
soda migrate down -e development只执行最新一个 migration 的Down()函数;soda migrate rollback 20260928152233才能退到指定时间戳版本 -
buffalo db migrate默认只识别.up.fizz和.down.fizz文件;手改后缀为.up.sql或.fizz会被完全跳过,且不报错 - 时间戳是唯一排序依据:手动删零(如把
20260928152233改成2026928152233)会导致 soda 直接忽略该文件
最易被忽略的是迁移执行时机——buffalo build 打包的二进制里不包含迁移逻辑,它只打包 SQL 文件;启动时若 schema 缺失,服务会直接 crash,而不是自动跑迁移。










