我目前正在使用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"
它让我无法将数据插入我的数据库。
表格的我的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')
};
我调用的函数插入数据如下所示:
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
})
}
关于可能导致这种情况的任何想法?
答案 0 :(得分:4)
好的,我明白了。
尝试从种子中删除id
字段。
让我解释为什么会发生这种情况
Postgres自动增量字段的值来自sequences
您可以在\d <table_name>
界面中尝试psql
命令。它会给你类似的东西
...
id | bigint | not null default nextval('<table_name>_id_seq'::regclass)
...
通过
insert into table_name (name) values ('Kappa')
您实际上省略了id
字段并插入默认值,即nextval('<table_name>_id_seq')
。
通过在查询中明确指定您的id
参数,您不使用此功能,并在下次使用时 - 您可以获得ID的冲突。您还插入了id = 1
和nextval
生成的1
。