You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Ecto迁移中结合PostgreSQL ENUM类型使用Ecto.Enum?

在Ecto中使用PostgreSQL内置ENUM类型的迁移方案

要在Ecto里用上PostgreSQL的原生ENUM类型来减少存储占用,你需要手动在迁移中创建枚举类型,步骤如下:

1. 编写迁移创建枚举并添加字段

在迁移文件里通过原生SQL创建枚举类型,再把字段关联到这个类型:

def change do
  # 先创建自定义枚举类型,替换成你的枚举值
  execute("CREATE TYPE status_enum AS ENUM ('pending', 'approved', 'rejected')")
  
  # 添加字段,类型指定为刚创建的枚举类型
  add :status, :status_enum
end

2. 在Schema中绑定枚举映射

在对应的Ecto Schema里,用Ecto.Enum把数据库枚举和Elixir原子映射起来,同时指定数据库类型:

schema "your_table_name" do
  field :status, Ecto.Enum, 
    values: [:pending, :approved, :rejected], 
    type: :status_enum
end

3. 处理回滚逻辑

如果需要回滚迁移,要先删除关联的字段,再删除枚举类型,避免数据库报错:

def down do
  remove :status
  execute("DROP TYPE status_enum")
end

替代方案参考

如果觉得原生SQL维护起来太繁琐,也可以根据场景选其他方式:

  • 继续用Ecto.Enum配合:string类型:迁移和维护更简单,虽然存储占用比原生ENUM略高,但对于大多数场景差异不大
  • 用整数类型映射枚举:存储占用最小,但可读性差,需要额外维护整数和枚举值的映射关系,适合对存储极致敏感的场景

内容的提问来源于stack exchange,提问作者cjm2671

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 12:06:29