TypeORM+PostgreSQL插入实体报错:id列空值违反非空约束
可能的原因及对应解决方案
1. 数据库表缺少uuid生成默认值
你手动编写的建表语句没有为id字段配置自动生成uuid的默认值,PostgreSQL不会自动为非自增、无默认值的非空字段生成值。
正确的建表语句需要先开启uuid扩展,再配置字段默认值:
-- 先开启uuid扩展 CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; CREATE TABLE "my_table"( "id" uuid NOT NULL DEFAULT uuid_generate_v4(), CONSTRAINT PK_my_table PRIMARY KEY (id) );
其他实体运行正常大概率是因为它们是通过TypeORM的synchronize: true自动创建的表,TypeORM会自动为带@Generated('uuid')的字段添加默认值。
2. 注解组合存在版本兼容问题
部分旧版本TypeORM对@PrimaryColumn + @Generated('uuid')的组合支持存在缺陷,你可以直接使用更简洁的@PrimaryGeneratedColumn注解替换:
import { Entity, PrimaryGeneratedColumn } from 'typeorm'; @Entity('my_table') export class MyTable { @PrimaryGeneratedColumn('uuid') id!: string; }
该注解本身就包含了主键、uuid类型、自动生成的逻辑,兼容性更好。
3. 实体元数据未被当前EntityManager加载
如果你使用的是自定义初始化的EntityManager,没有提前将MyTable实体注册到对应数据源的元数据列表中,TypeORM会识别不到@Generated注解,不会在插入时自动处理id字段,导致插入空值报错。可检查你当前使用的EntityManager对应的数据源配置中,是否包含了MyTable实体的扫描路径。
4. 存在全局拦截逻辑覆盖id值
检查是否有全局的实体监听器、字段转换器、或者业务中间件在save操作执行前,自动为实体添加了值为undefined的id字段,该操作会覆盖TypeORM的自动生成逻辑。
内容的提问来源于stack exchange,提问作者George
相关产品推荐
相关产品推荐

