我试图使用node-postgres在我的postgres数据库中查询一个名为DOCUMENT
的模式。
我似乎无法获得针对指定模式运行的查询。
这个查询可以直接在使用psql的postgres上运行
SELECT * FROM "DOCUMENT".document_metadata m
LEFT OUTER JOIN "DOCUMENT".document_attributes a
ON a.document_id = m.id
字符串
此代码产生以下错误
const query = `SELECT * FROM "DOCUMENT".document_metadata m
LEFT OUTER JOIN "DOCUMENT".document_attributes a
ON a.document_id = m.id`
const metadata = await db.query(query)
型
误差
error: relation "DOCUMENT.document_metadata" does not exist
at Connection.parseE (/usr/src/app/node_modules/pg/lib/connection.js:602:11)
at Connection.parseMessage (/usr/src/app/node_modules/pg/lib/connection.js:399:19)
at Socket.<anonymous> (/usr/src/app/node_modules/pg/lib/connection.js:121:22)
at Socket.emit (events.js:189:13)
at addChunk (_stream_readable.js:284:12)
at readableAddChunk (_stream_readable.js:265:11)
at Socket.Readable.push (_stream_readable.js:220:10)
at TCP.onStreamRead [as onread] (internal/stream_base_commons.js:94:17)
型
我也试过这个
const query = `SET search_path TO 'DOCUMENT';
SELECT * FROM document_metadata m
LEFT OUTER JOIN document_attributes a
ON a.document_id = m.id;`
const metadata = await db.query(query)
型
从而产生错误
error: relation "document_metadata" does not exist
at Connection.parseE (/usr/src/app/node_modules/pg/lib/connection.js:602:11)
at Connection.parseMessage (/usr/src/app/node_modules/pg/lib/connection.js:399:19)
at Socket.<anonymous> (/usr/src/app/node_modules/pg/lib/connection.js:121:22)
at Socket.emit (events.js:189:13)
at addChunk (_stream_readable.js:284:12)
at readableAddChunk (_stream_readable.js:265:11)
at Socket.Readable.push (_stream_readable.js:220:10)
at TCP.onStreamRead [as onread] (internal/stream_base_commons.js:94:17)
型
更新当我直接在psql中运行这些相同的查询时,我看到10行带有表名的行。当我通过我的节点代码运行时,我看不到行:
const metadata4 = await db.query('SHOW search_path;')
console.log('search_path after setting = ', metadata4.rows) // prints [ { search_path: '"DOCUMENT"' } ]
const tables = await db.query(`SELECT * FROM information_schema.tables where table_schema = 'DOCUMENT';`)
console.log('tables = ', tables.rows) // prints []
型
5条答案
按热度按时间zbsbpyhn1#
在一个单独的行中执行:
字符串
DOCUMENT是模式的名称,然后执行普通查询:
型
vom3gejh2#
也许问题就出在表名上。你有没有尝试过使用表名的模式名?或者在表名周围加上引号:
字符串
在Client/Pool的环境变量中定义schema
无论如何,如果你想在node js中定义模式,而不需要在不同的模式之间切换,那么这个解决方案是一个不错的选择。默认模式可以来自环境变量。
型
在该示例中,PG_OPTIONS是字符串化的JSON,例如经由命令行、PM2生态系统文件等提供。
例如:
PG_OPTIONS='{"search_path":"DOCUMENT"}' node app.js
我从Windows命令提示符启动(对不起:))
型
sigwle7e3#
如果有人仍然感兴趣,您可以使用连接字符串和传递选项,而不仅仅是模式。
字符串
g52tjvyc4#
当您创建DB URL时,您可以像这样将schema附加到它:
字符串
cidc1ykv5#
自2016年以来一直开放的node-postgres中的Issue #1123是一个请求,用于向连接请求添加支持以指定当前模式。
这显然不能在短期内解决您的问题,但是如果这个特性请求得到实现,可以使用它来假设所有查询都应该针对给定的模式。