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

如何使用mix phx.gen.html为数据库列添加长度或非空约束

在Phoenix中通过mix phx.gen.html设置数据库列的长度与非空约束

嘿,刚好对Phoenix的数据库约束设置熟得很,这就给你一步步讲清楚怎么用mix phx.gen.html搞定长度和非空约束,分两种场景:生成资源时直接指定,或者生成后调整迁移文件。

一、设置列长度约束

1. 生成资源时直接指定长度

你可以在mix phx.gen.html的列定义里直接追加长度数值,比如要给title列设置最大长度50,命令可以这么写:

mix phx.gen.html Blog Post posts title:string:50 content:text

执行这个命令后,生成的迁移文件里会自动给title列加上size: 50的参数,对应数据库里的varchar(50)类型。

2. 生成后修改迁移文件补全约束

如果生成资源时忘了加长度,或者需要更精细的约束(比如同时限制最小长度),可以打开priv/repo/migrations/下对应的迁移文件,手动调整:

defmodule YourApp.Repo.Migrations.CreatePosts do
  use Ecto.Migration

  def change do
    create table(:posts) do
      add :title, :string, size: 50  # 最大长度50
      add :content, :text

      timestamps()
    end

    # 额外添加数据库层面的最小长度检查约束(可选)
    create constraint("posts", :title_min_length, check: "char_length(title) >= 3")
  end
end

二、设置非空约束

1. 生成资源时直接标记非空

同样可以在列定义后追加:not_null来指定非空,比如:

mix phx.gen.html Blog Post posts title:string:50:not_null content:text:not_null

这样生成的迁移文件里,对应的列会自动带上null: false参数,数据库层面就会强制该列不能为NULL。

2. 生成后手动修改迁移文件

如果生成时没加非空约束,打开迁移文件给目标列添加null: false即可:

add :title, :string, size: 50, null: false
add :content, :text, null: false

额外建议:同时添加应用层验证

数据库约束是最后一道防线,建议在Ecto Schema的Changeset里也加上验证,这样能在应用层提前拦截错误,提升用户体验。比如在lib/your_app/blog/post.ex里:

defmodule YourApp.Blog.Post do
  use Ecto.Schema
  import Ecto.Changeset

  schema "posts" do
    field :title, :string
    field :content, :text

    timestamps()
  end

  @doc false
  def changeset(post, attrs) do
    post
    |> cast(attrs, [:title, :content])
    |> validate_required([:title, :content])  # 应用层非空验证
    |> validate_length(:title, min: 3, max: 50)  # 应用层长度验证
  end
end

最后别忘了,修改完迁移文件后,运行mix ecto.migrate就能把约束同步到数据库啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:13:00