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

Node.js中PostgreSQL+Objection.js插入数据报错:column 'id' does not exist

解决Objection.js插入时报错"column 'id' does not exist"的问题

我帮你排查了下这个问题,核心原因是Objection.js默认会假设表的主键字段名为id,但你的employee和salary表主键分别是employee_id和salary_id,这就导致ORM在执行插入操作后,试图去操作或返回id字段时找不到对应列,直接抛出了错误。

具体修复步骤

你只需要在两个Model类里明确指定各自的主键字段名称即可:

1. 更新 testSalary.js 中的Salary模型

添加idColumn静态属性,告诉Objection.js主键是salary_id:

const { Model, snakeCaseMappers } = require('objection');
class Salary extends Model {
  static get tableName() { return 'salary'; }
  // 新增这一行,指定主键字段
  static get idColumn() { return 'salary_id'; }
  static get columnNameMappers() { return snakeCaseMappers(); }
  static get jsonSchema() {
    return {
      type: 'object',
      properties: {
        salary_id: { type: 'integer' },
        employee_id: { type: 'integer' },
        amount: { type: 'integer' },
      },
    };
  }
  static get relationMappings() {
    return {
      employee: {
        relation: Model.BelongsToOneRelation,
        modelClass: `${__dirname}/testEmployee`,
        join: { from: 'salary.employee_id', to: 'employee.employee_id', },
      },
    };
  }
}
module.exports = Salary;

2. 更新 testEmployee.js 中的Employee模型

同样添加idColumn指定主键为employee_id:

const { Model, snakeCaseMappers } = require('objection');
class Employee extends Model {
  static get tableName() { return 'employee'; }
  // 新增这一行,指定主键字段
  static get idColumn() { return 'employee_id'; }
  static get columnNameMappers() { return snakeCaseMappers(); }
  static get jsonSchema() {
    return {
      type: 'object',
      properties: {
        employee_id: { type: 'integer' },
        employee_name: { type: 'string' },
      },
    };
  }
  static get relationMappings() {
    return {
      salary: {
        relation: Model.HasManyRelation,
        modelClass: `${__dirname}/testSalary`,
        join: { from: 'employee.employee_id', to: 'salary.employee_id', },
      },
    };
  }
}
module.exports = Employee;

额外的表结构优化提示

另外注意你salary表的employee_id字段定义有个小问题:

CREATE TABLE salary ( 
  salary_id SERIAL PRIMARY KEY, 
  employee_id SERIAL UNIQUE, -- 这里SERIAL是错误的,会自动生成不必要的序列
  FOREIGN KEY (employee_id) REFERENCES employee (employee_id), 
  amount integer 
);

SERIAL类型会自动创建一个自增序列,但employee_id作为外键,只需要关联employee表的主键即可,不需要自增。正确的定义应该改成INTEGER UNIQUE:

CREATE TABLE salary ( 
  salary_id SERIAL PRIMARY KEY, 
  employee_id INTEGER UNIQUE,
  FOREIGN KEY (employee_id) REFERENCES employee (employee_id), 
  amount integer 
);

完成以上修改后,再运行你的插入代码就能正常工作啦,插入成功后会返回新创建的salary记录。

内容的提问来源于stack exchange,提问作者Matt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:25:05