buffalo框架中使用fizz语法编写数据库迁移文件,可实现跨数据库(postgresql/mysql/sqlite)的兼容性;通过buffalo pop generate fizz生成带时间戳的.fizz文件,不可手动修改时间戳;fizz自动添加id及created_at/updated_at字段,支持uuid主键、外键、索引及多种列类型配置。

在Buffalo框架中使用Fizz语法编写数据库迁移文件,是为了让不同数据库(如PostgreSQL、MySQL、SQLite)能共用同一份迁移逻辑,避免手写SQL带来的兼容性问题。
创建Fizz迁移文件
执行命令生成带时间戳前缀的.fizz文件:
buffalo pop generate fizz add_users_table
该命令会在migrations/目录下生成类似20260923110600_add_users_table.fizz的文件。文件名中的时间戳确保迁移按序执行,【不可手动修改时间戳部分】,否则会导致pop migrate跳过或乱序。
基础建表语法
Fizz使用函数式DSL描述表结构。以下是最小可用的users表定义:
create_table("users") {
t.Column("email", "string", {})
t.Column("age", "integer", {"default": 0})
t.Column("admin", "bool", {"default": false})
}
注意:无需显式声明id列——Fizz默认会自动添加id(serial或uuid,取决于数据库配置)和created_at/updated_at时间戳字段。若需禁用时间戳,必须显式调用t.DisableTimestamps()或在create_table第二参数传{timestamps: false}。
定义主键与UUID ID
方法一:使用UUID作为主键(推荐用于分布式场景)
create_table("users") {
t.Column("id", "uuid", {"primary": true})
t.Column("email", "string", {})
t.DisableTimestamps()
}
方法二:显式关闭默认时间戳并保留整数ID(此时id仍由Fizz自动生成,类型为integer)
create_table("users", {timestamps: false}) {
t.Column("email", "string", {})
}
【t.DisableTimestamps()必须写在Column之后,否则无效】
添加外键与索引
第一步:声明外键列
t.Column("user_id", "integer", {})
Buffalo框架 1.0.1 版本源码包下载,适合需要错误处理改进、依赖更新、render.Download 注释和 request logger 调整的 v1 项目。
第二步:在Column块内调用ForeignKey方法(注意:列名必须已存在)
t.ForeignKey("user_id", {"users": ["id"]}, {"on_delete": "cascade"})
第三步:如需加速查询,可额外添加索引
t.Index("idx_todos_user_id", ["user_id"], {})
ForeignKey的第三个参数是约束选项,on_delete: "cascade"表示删除用户时自动删除其todos;若不指定,多数数据库默认为NO ACTION,迁移可能成功但运行时行为不符合预期。
常见列类型与配置写法
string → 对应VARCHAR,默认长度由数据库决定;加size限制:
t.Column("handle", "string", {"size": 50})
timestamp → 精确到微秒,自动处理时区(PostgreSQL)或本地时间(SQLite):
t.Column("published_at", "timestamp", {"null": true})
jsonb → 仅PostgreSQL支持,SQLite和MySQL会忽略该列(迁移仍通过,但列不创建):
t.Column("metadata", "jsonb", {"null": true})
text → 存储长文本,无长度限制,适合bio、content等字段:
t.Column("bio", "text", {"null": true})










