buffalo 的 pop 工具生成迁移文件或执行迁移时默认仅操作 schema,不导出数据;若需从现有数据库反向生成纯表结构迁移,应使用 buffalo pop generate sql --name xxx。

buffalo pop migrate 生成迁移文件时默认不导出数据
Buffalo 的 pop 工具本身不提供「仅导出表结构」的独立命令,但它在生成迁移文件(buffalo pop generate migration)或执行迁移(buffalo pop migrate)时,天然只操作 schema —— 即建表语句、字段、索引、外键等,完全不触碰数据行。这是它的设计前提,不是配置项可开关的行为。
常见误解是以为 buffalo pop migrate 会 dump 数据,其实它只是按 migrations/ 下的 SQL 或 Go 文件执行 DDL。只要没手动写 INSERT 或调用 pop.LoadFixture,就不会有数据被导出或写入。
想从现有数据库反向生成空表结构迁移?用 buffalo pop generate sql
如果你已有数据库(比如 PostgreSQL),想把当前表结构“翻译”成 Buffalo 可用的迁移文件(不含任何 INSERT),运行:
buffalo pop generate sql --name create_tables_from_existing
这个命令会连接 database.yml 中对应环境的 DB,读取 schema 元信息(pg_tables、information_schema.columns 等),生成纯 DDL 的 .sql 迁移文件,例如:
CREATE TABLE users ( id UUID PRIMARY KEY, name TEXT, created_at TIMESTAMP WITH TIME ZONE );
注意:--name 是必须的;生成的 SQL 不含 INSERT、COPY 或 VALUES;它不会读取表内容,只查 metadata。
避免误导出数据的三个关键点
-
buffalo pop load才会导入 fixtures(即数据),只要不用它,就不可能导出或写入数据 - 检查
migrations/目录下生成的文件:如果是.sql,确认里面没有INSERT;如果是.go,确认Up函数里只调用tx.CreateTable或tx.Raw执行 DDL,没调tx.Insert - 别混淆
buffalo pop migrate和pg_dump --schema-only:后者是 PostgreSQL 原生命令,而 Buffalo 的生态里没有等价封装——需要 schema-only 导出时,应直接用pg_dump -s或mysqldump --no-data,再人工转成迁移文件
为什么不能直接 buffalo pop dump --schema-only
因为 pop 库定位是迁移与 fixture 管理,不是数据库快照工具。它不内置 schema dump 功能,也不计划加——官方建议:结构导出交给 DB 原生命令,结构变更交给迁移文件,数据初始化走 fixtures/。混用会导致迁移不可逆、环境不一致。真正要跨环境同步空结构,最稳的方式仍是先用 pg_dump -s 生成 SQL,再放进 migrations/ 手动建文件。











