使用TypeORM迁移的createTable时,如何指定ID由数据库生成?
问题:TypeORM插入数据时ID字段违反非空约束
我在迁移中定义了创建categoria表的代码:
public async up(queryRunner: QueryRunner): Promise<void> { await queryRunner.createTable(new Table({ name: 'categoria', columns: [{ name: 'id', type: 'int', isPrimary: true, generatedIdentity: 'ALWAYS' }, { name: 'nome', type: 'varchar(100)' }, { name: 'categoria_mercadolivre', type: 'varchar(100)' } ] }), true) }
在另一个迁移中尝试插入数据:
await queryRunner.manager.query(`insert into categoria (nome) values ('eletrônicos');`);
但出现错误:
error: null value in column "id" of relation "categoria" violates not-null constraint
请问该如何让TypeORM知晓ID是由数据库生成的?
解决方案
问题核心是你用原生SQL插入数据时,没有利用TypeORM的自动字段处理机制,或者表结构的生成策略没有正确配置。以下是两种可行的解决方式:
1. 使用TypeORM实体管理器的save方法插入
如果有对应的Categoria实体类,直接调用save方法,TypeORM会自动识别数据库生成的ID字段,无需手动传入:
await queryRunner.manager.save(Categoria, { nome: 'eletrônicos' });
2. 调整表结构配置并修正原生SQL
首先检查迁移中的ID字段配置,确保数据库真的生成ID值。可以将generatedIdentity替换为更通用的生成策略配置:
{ name: 'id', type: 'int', isPrimary: true, isGenerated: true, generationStrategy: 'increment' // 针对MySQL/PostgreSQL等主流数据库适用,也可根据数据库选择'identity' }
然后修改原生插入语句,明确让数据库使用默认生成的ID(部分数据库省略ID字段即可生效):
-- 推荐:省略ID字段,数据库自动生成 insert into categoria (nome) values ('eletrônicos'); -- 或者显式指定DEFAULT insert into categoria (id, nome) values (DEFAULT, 'eletrônicos');
内容的提问来源于stack exchange,提问作者Diego Alves
相关产品推荐
相关产品推荐

