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
相关产品推荐
相关产品推荐

