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)
关于什么可能导致此的任何想法?
知道了
尝试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 = 1并nextval生成1了。