重复键值违反了唯一约束-使用KnexJS和Postgresql

Tod*_*ter 2 javascript postgresql heroku node.js knex.js

我目前正在使用KnexJS框架构建一个应用程序,可帮助我在开发中编写sqlite3并在生产中编写PostgreSQL(用于Heroku)。

我的主要问题是我的应用程序在我的机器上时可以正常运行,但是一旦将其上传到heroku,它就会崩溃。在Heroku日志中,我收到消息:

{ error: insert into "contracts" ("contract_desc", "contract_header", "owner_id", "signee_id") values ($1, $2, $3, $4) - duplicate key value violates unique constraint "contracts_pkey"
Run Code Online (Sandbox Code Playgroud)

而且这使我无法将数据插入数据库。

我的表Knex迁移设置如下:

exports.up = function(knex, Promise) {
  return knex.schema.createTable('contracts', function (table) {
    table.increments('id').primary()
    table.integer('owner_id')
    table.integer('signee_id')
    table.string('contract_header')
    table.text('contract_desc')
    table.string('signature_url')
    table.string('date_signed')
    table.boolean('isSigned')
      })
   };

exports.down = function(knex, Promise) {
  return knex.schema.dropTable('contracts')
};
Run Code Online (Sandbox Code Playgroud)

我调用的用于插入数据的函数如下所示:

function newContract (id, contractDetails) {
  return knex('contracts')
  .select('owner_id', 'signee_id', 'contract_header', 'contract_desc')
  .insert({
    owner_id: id,
    signee_id: contractDetails.signee_id,
    contract_header: contractDetails.contract_header,
    contract_desc:contractDetails.contract_desc
  })
}
Run Code Online (Sandbox Code Playgroud)

关于什么可能导致此的任何想法?

coo*_*koo 5

知道了

尝试id从种子中删除字段。

让我解释一下为什么会这样

Postgres自动增量字段从序列中获取值

您可以\d <table_name>psql界面中尝试命令。它会给你类似的东西

...
 id         | bigint                   | not null default nextval('<table_name>_id_seq'::regclass)
...
Run Code Online (Sandbox Code Playgroud)

通过做

insert into table_name (name) values ('Kappa')
Run Code Online (Sandbox Code Playgroud)

您实际上忽略了id字段并插入了默认nextval('<table_name>_id_seq')

通过id在查询中明确指定参数,您将不使用此函数,而下次使用该函数时,可能会遇到ID冲突。您也插入id = 1nextval生成1了。