在Phoenix中保存数据至数据库时遇`null value in column "id" of relation table_name`错误
解决Repo.insert时id字段为null的问题
出现这个问题通常是这几个原因,对应排查就行:
数据库表的id字段没配置自动生成规则
你说id不用手动设置,前提是数据库里这个字段得是自动递增/生成的。比如PostgreSQL里得把id设成SERIAL、IDENTITY类型,或者绑定了序列。要是表结构里id只是普通INT,没开自动生成,数据库肯定会要求你传值,不然就报null错误。Ecto Schema的主键配置错了
检查你的Schema定义,默认Ecto会把:id设为自增主键,但如果主键名不是id,或者你手动改了配置——比如写了field :id, :integer而不是用默认主键设置,或者改了@primary_key却没开autogenerate: true——那Ecto就不会自动生成id,插入时就会传null。正确的主键配置示例:
# 默认自增整数主键 schema "table_name" do # 其他字段定义... end # 或者手动指定UUID类型主键(需开启自动生成) @primary_key {:id, :binary_id, autogenerate: true} schema "table_name" do # 其他字段定义... end创建表的迁移文件有问题
看一下该表的迁移代码,是不是没把id设为自增主键。正常创建表的迁移应该是:create table(:table_name) do # 其他字段 end这样默认会生成自增的id主键。要是你手动写
add :id, :integer,没加primary_key: true和autogenerate: true,那表结构就不符合预期,插入时自然报错。插入时不小心传了id: nil
检查你构造的插入数据或者changeset,有没有手动把id: nil写进去?比如构造%{id: nil, name: "xxx"}这种数据,会覆盖Ecto自动生成的id值,导致插入时传null。
内容的提问来源于stack exchange,提问作者beepboop
相关产品推荐
相关产品推荐

