Node.js ORM-拒绝错误:列“;id";不存在

Node.js ORM-拒绝错误:列“;id";不存在,node.js,postgresql,orm,node-postgres,objection.js,Node.js,Postgresql,Orm,Node Postgres,Objection.js,我使用PostgreSQL和Node.js作为ORM的后端。我只有两个具有一对一关系的简单表。我无法将新记录插入表中 我有一个简单的数据库模式,其中包含employee和salary表: CREATE TABLE employee ( employee_id SERIAL PRIMARY KEY, employee_name VARCHAR ); INSERT INTO employee (employee_name) VALUES ('james'); CREATE TAB

我使用PostgreSQL和Node.js作为ORM的后端。我只有两个具有一对一关系的简单表。我无法将新记录插入表中

我有一个简单的数据库模式,其中包含employee和salary表:

CREATE TABLE employee (
    employee_id SERIAL PRIMARY KEY,
    employee_name VARCHAR
);

INSERT INTO employee (employee_name) VALUES ('james');

CREATE TABLE salary (
  salary_id SERIAL PRIMARY KEY,
  employee_id SERIAL UNIQUE,
  FOREIGN KEY (employee_id) REFERENCES employee (employee_id),
  amount integer
);
如果我想通过objective.js创建新的薪资记录:

Salary.query()
          .insert({ employee_id: 1, amount: 10 })
          .then((data) => {
            console.log(data);
          })
          .catch((err) => {
            throw err;
          });
我得到一个错误:

Unhandled rejection error: column "id" does not exist
at Connection.parseE (./node_modules/pg/lib/connection.js:546:11)
at Connection.parseMessage (./node_modules/pg/lib/connection.js:371:19)
at TLSSocket.<anonymous> (./node_modules/pg/lib/connection.js:114:22)
at emitOne (events.js:115:13)
at TLSSocket.emit (events.js:210:7)
at addChunk (_stream_readable.js:252:12)
at readableAddChunk (_stream_readable.js:239:11)
at TLSSocket.Readable.push (_stream_readable.js:197:10)
at TLSWrap.onread (net.js:589:20)
testEmployee.js

const { Model, snakeCaseMappers } = require('objection');

class Salary extends Model {
  static get tableName() {
    return 'salary';
  }

  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;
const { Model, snakeCaseMappers } = require('objection');

class Employee extends Model {
  static get tableName() {
    return 'employee';
  }

  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;

我的猜测是这与对Knex的依赖有关。在中,有一段代码片段建议通过Knex迁移创建表。也许这样做可以解决您的问题,因为Knex可能会创建一个反对者希望存在的id列

我猜这与对Knex的依赖有关。在中,有一段代码片段建议通过Knex迁移创建表。也许这样做可以解决您的问题,因为Knex可能会创建一个反对者希望存在的id列

异议需要通过在
模型
类上定义
idColumn
来告知id列是什么

class Salary extends Model {
  static get tableName() {
    return 'salary';
  }

  static get idColumn() {
    return 'salary_id';
  }
  // etc
}

使用迁移来创建表将通过创建id列命名为
id
的表来实现这一点,但是,如果您定义了
idColumn

异议需要通过在
模型
类上定义
idColumn
来告知id列是什么,则可以使用异议而不迁移

class Salary extends Model {
  static get tableName() {
    return 'salary';
  }

  static get idColumn() {
    return 'salary_id';
  }
  // etc
}

使用迁移来创建表将通过创建id列命名为
id
的表来实现这一点,但是您可以使用无迁移的异议。如果您根据异议文档定义
idColumn

,您应该使用knex迁移来创建表。@SamH。你能提供一个链接吗?如果我检查一下,就会发现:下一步是创建一些迁移和模型,并开始使用objective.js。开始的最佳方法是查看示例项目。express示例项目是一个简单的express服务器。example-requests.sh文件包含一系列curl命令,供您开始使用RESTAPI。在入门部分的代码示例中。它在一个房间里comment@SamH. 非常感谢。如果你写它作为一个答案,我可以结束我的问题,并奖励你的答案。谢谢!请告诉我,如果提供的答案包括根据异议文档,您应该使用knex迁移创建表。@SamH。你能提供一个链接吗?如果我检查一下,就会发现:下一步是创建一些迁移和模型,并开始使用objective.js。开始的最佳方法是查看示例项目。express示例项目是一个简单的express服务器。example-requests.sh文件包含一系列curl命令,供您开始使用RESTAPI。在入门部分的代码示例中。它在一个房间里comment@SamH. 非常感谢。如果你写它作为一个答案,我可以结束我的问题,并奖励你的答案。谢谢!让我知道,如果提供的答案涵盖它