node-postgresを使用して 2 つのパラメーター化された挿入クエリを実行しようとしています。1 つ目は主キー列を指定し、2 つ目は指定しません。
2 番目のクエリは、主キー列を指定していませんが、主キーが重複していると言って失敗します。
私のpgテーブル:
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($1, $2, $3) RETURNING id';
var insertWithoutId = 'INSERT INTO teams(name, created_by) VALUES($1, $2) 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
パラメーターを再利用するとキャッシュされます。ソースを掘り下げてみると、私のクエリに name プロパティがあるとは思えません。
これを回避する方法について誰かアイデアがありますか?