You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:01:08