如何使用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
相关产品推荐
相关产品推荐

