node-postgres:已缓存参数化插入查询,第二次失败 运行
node-postgres: parameterised insert query cached, failing on 2nd run
我正在尝试 运行 使用 node-postgres 的两个参数化插入查询:第一个指定主键列,第二个不指定。
第二个查询,即使没有指定主键列,也失败说有重复的主键。
我的 pg table:
CREATE TABLE teams (
id serial PRIMARY KEY,
created_by int REFERENCES users,
name text,
logo text
);
重现此问题的代码:
var pg = require('pg');
var insertWithId = 'INSERT INTO teams(id, name, created_by) VALUES(, , ) RETURNING id';
var insertWithoutId = 'INSERT INTO teams(name, created_by) VALUES(, ) RETURNING id';
pg.connect(process.env.POSTGRES_URI, function (err, client, releaseClient) {
client.query(insertWithId, [1, 'First Team', 1], function (err, result) {
releaseClient();
if (err) {
throw err;
}
console.log('first team created');
});
});
pg.connect(process.env.POSTGRES_URI, function (err, client, releaseClient) {
client.query(insertWithoutId, ['Second Team', 1], function (err, result) {
releaseClient();
if (err) {
console.log(err);
}
});
});
而 运行 宁的输出:
first team created
{ [error: duplicate key value violates unique constraint "teams_pkey"]
name: 'error',
length: 173,
severity: 'ERROR',
code: '23505',
detail: 'Key (id)=(1) already exists.',
hint: undefined,
position: undefined,
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: 'public',
table: 'teams',
column: undefined,
dataType: undefined,
constraint: 'teams_pkey',
file: 'nbtinsert.c',
line: '406',
routine: '_bt_check_unique' }
我从阅读 node-postgres
源代码中收集到的信息是,参数化查询被视为准备好的查询,如果它们重用 name
参数,则会被缓存;虽然通过挖掘它的来源,它似乎并不认为我的查询有一个名字 属性.
有没有人知道如何避免这种情况?
第一个插入为 id
提供了一个值,因此序列号不会递增。第一次插入后序列号仍然是 1。第二个插入 而不是 为 id
提供值,因此使用序列号 (=1)。这是重复的。最好的解决方案是 仅 使用第二个语句,并让应用程序在需要时使用返回的 ID。
简而言之:不要干扰连续剧。
如果您需要更正序列的下一个值,您可以使用类似下面的语句。
SELECT setval('teams_id_seq', (SELECT MAX(id) FROM teams) )
;
我正在尝试 运行 使用 node-postgres 的两个参数化插入查询:第一个指定主键列,第二个不指定。
第二个查询,即使没有指定主键列,也失败说有重复的主键。
我的 pg table:
CREATE TABLE teams (
id serial PRIMARY KEY,
created_by int REFERENCES users,
name text,
logo text
);
重现此问题的代码:
var pg = require('pg');
var insertWithId = 'INSERT INTO teams(id, name, created_by) VALUES(, , ) RETURNING id';
var insertWithoutId = 'INSERT INTO teams(name, created_by) VALUES(, ) RETURNING id';
pg.connect(process.env.POSTGRES_URI, function (err, client, releaseClient) {
client.query(insertWithId, [1, 'First Team', 1], function (err, result) {
releaseClient();
if (err) {
throw err;
}
console.log('first team created');
});
});
pg.connect(process.env.POSTGRES_URI, function (err, client, releaseClient) {
client.query(insertWithoutId, ['Second Team', 1], function (err, result) {
releaseClient();
if (err) {
console.log(err);
}
});
});
而 运行 宁的输出:
first team created
{ [error: duplicate key value violates unique constraint "teams_pkey"]
name: 'error',
length: 173,
severity: 'ERROR',
code: '23505',
detail: 'Key (id)=(1) already exists.',
hint: undefined,
position: undefined,
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: 'public',
table: 'teams',
column: undefined,
dataType: undefined,
constraint: 'teams_pkey',
file: 'nbtinsert.c',
line: '406',
routine: '_bt_check_unique' }
我从阅读 node-postgres
源代码中收集到的信息是,参数化查询被视为准备好的查询,如果它们重用 name
参数,则会被缓存;虽然通过挖掘它的来源,它似乎并不认为我的查询有一个名字 属性.
有没有人知道如何避免这种情况?
第一个插入为 id
提供了一个值,因此序列号不会递增。第一次插入后序列号仍然是 1。第二个插入 而不是 为 id
提供值,因此使用序列号 (=1)。这是重复的。最好的解决方案是 仅 使用第二个语句,并让应用程序在需要时使用返回的 ID。
简而言之:不要干扰连续剧。
如果您需要更正序列的下一个值,您可以使用类似下面的语句。
SELECT setval('teams_id_seq', (SELECT MAX(id) FROM teams) )
;