使用Node.js+Objection.js向PostgreSQL插入数据时ID列非空约束报错
解决Objection.js插入PostgreSQL时id列非空约束报错的问题
我来帮你搞定这个问题!你遇到的error: null value in column "id" violates not-null constraint报错,核心原因是Objection.js不知道你的id列是数据库自动生成的自增字段,导致插入时把null(或者未处理的空值)传到了这个字段,触发了PostgreSQL的非空约束。
下面是具体的解决步骤:
1. 确认PostgreSQL表结构正确
首先确保你的表id列是自增类型,PostgreSQL里有两种常用写法:
- 传统的
SERIAL类型(兼容旧版本):
CREATE TABLE your_table ( id SERIAL PRIMARY KEY, -- 其他业务字段... );
- PostgreSQL 10+推荐的
IDENTITY类型(更标准):
CREATE TABLE your_table ( id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY, -- 其他业务字段... );
2. 在Objection.js Model中正确配置主键
你需要明确告诉Objection.js:id是主键,并且由数据库自动生成,插入时不需要手动传入。
普通JavaScript写法
const { Model } = require('objection'); class YourModel extends Model { // 指定对应数据库表名 static get tableName() { return 'your_table'; } // 指定主键字段 static get idColumn() { return 'id'; } // 格式化插入到数据库的JSON数据 $formatDatabaseJson(json) { json = super.$formatDatabaseJson(json); // 执行插入操作时,主动移除id字段,交给数据库自动生成值 if (this.$isInsert()) { delete json.id; } return json; } }
TypeScript+装饰器写法(更简洁)
如果使用TypeScript,可以借助Objection的装饰器快速标记字段属性:
import { Model, Column, PrimaryKey, Generated } from 'objection'; class YourModel extends Model { static tableName = 'your_table'; @PrimaryKey() // 标记该字段为主键 @Generated() // 告诉Objection这是数据库自动生成的字段 id!: number; // 示例业务字段 @Column() name!: string; @Column() email!: string; }
3. 确保插入代码不手动传入id
最后检查你的插入逻辑,绝对不要在插入对象里包含id字段,比如:
// 正确的插入写法 const newRecord = await YourModel.query().insert({ name: '测试用户', email: 'test@example.com' // 这里不要写id: null或者id: undefined });
这样配置后,Objection.js会自动在插入SQL中忽略id字段,PostgreSQL就会用序列自动生成id值,不会再触发非空约束报错了。
内容的提问来源于stack exchange,提问作者ps2goat
相关产品推荐
相关产品推荐

