Node.js 和 Postgres:链式查询中的临时 table "relation does not exist"
Node.js and Postgres: Temporary table "relation does not exist" on chained query
我正在尝试创建一个临时 table,然后使用 node-pg 库对其执行 SELECT
查询。使用 promises 和 .then()
,我等待创建 table(或者看起来应该是这样),然后执行我的选择查询:
const tempText = `
CREATE TEMPORARY TABLE IF NOT EXISTS temp1 AS
(
SELECT colA, colB
FROM foo
GROUP BY colA, colB
)
`;
const queryText = `
SELECT colA, COUNT(colA) as total
FROM temp1
GROUP BY colA
ORDER BY COUNT(colA) DESC
`;
// using pooling
return db.query({ text: tempText, values })
.then(() => {
return db.query(queryText).then(({ rows }) => rows);
})
.catch((err) => { throw err; });
此代码全部存在于 GraphQL 解析器中。问题是,我第一次通过 API 命中它时,我得到 "relation \"temp1\" does not exist",但所有后续调用都成功并且有 return 数据。为什么会这样?在执行 SELECT
之前,我正在等待第一个查询完成
临时表特定于一个会话,单独的 db.query()
调用不能保证在同一会话中 运行,因为 db
是一个单独获取客户端的池对于每个 query()
电话。明确抓住客户:
return db.connect().then(async client => {
try {
await client.query({ text: tempText, values });
const result = await client.query(queryText);
return result.rows;
} finally {
client.release();
}
});
另请注意,.catch((err) => { throw err; })
不会执行任何操作。
我正在尝试创建一个临时 table,然后使用 node-pg 库对其执行 SELECT
查询。使用 promises 和 .then()
,我等待创建 table(或者看起来应该是这样),然后执行我的选择查询:
const tempText = `
CREATE TEMPORARY TABLE IF NOT EXISTS temp1 AS
(
SELECT colA, colB
FROM foo
GROUP BY colA, colB
)
`;
const queryText = `
SELECT colA, COUNT(colA) as total
FROM temp1
GROUP BY colA
ORDER BY COUNT(colA) DESC
`;
// using pooling
return db.query({ text: tempText, values })
.then(() => {
return db.query(queryText).then(({ rows }) => rows);
})
.catch((err) => { throw err; });
此代码全部存在于 GraphQL 解析器中。问题是,我第一次通过 API 命中它时,我得到 "relation \"temp1\" does not exist",但所有后续调用都成功并且有 return 数据。为什么会这样?在执行 SELECT
临时表特定于一个会话,单独的 db.query()
调用不能保证在同一会话中 运行,因为 db
是一个单独获取客户端的池对于每个 query()
电话。明确抓住客户:
return db.connect().then(async client => {
try {
await client.query({ text: tempText, values });
const result = await client.query(queryText);
return result.rows;
} finally {
client.release();
}
});
另请注意,.catch((err) => { throw err; })
不会执行任何操作。