postgresql 如何使用node-postgres设置schema

vohkndzv  于 2023-11-18  发布在  PostgreSQL
关注(0)|答案(5)|浏览(197)

我试图使用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 []

zbsbpyhn

zbsbpyhn1#

在一个单独的行中执行:

db.query("SET search_path TO 'DOCUMENT';")

字符串
DOCUMENT是模式的名称,然后执行普通查询:

const query = `SELECT * FROM document_metadata m 
               LEFT OUTER JOIN document_attributes a 
               ON a.document_id = m.id;`

db.query(query)

vom3gejh

vom3gejh2#

也许问题就出在表名上。你有没有尝试过使用表名的模式名?或者在表名周围加上引号:

const query = 'SELECT * FROM "DOCUMENT"."document_metadata" m 
               LEFT OUTER JOIN "DOCUMENT"."document_attributes" a 
               ON a.document_id = m.id'

字符串

在Client/Pool的环境变量中定义schema

无论如何,如果你想在node js中定义模式,而不需要在不同的模式之间切换,那么这个解决方案是一个不错的选择。默认模式可以来自环境变量。

const Pool = require('pg').Pool
const Client = require('pg').Client

class EnhancedClient extends Client {
  getStartupConf() {
    if (process.env.PG_OPTIONS) {
      try {
        const options = JSON.parse(process.env.PG_OPTIONS);
        return {
          ...super.getStartupConf(),
          ...options,
        };
      } catch (e) {
        console.error(e);
        // Coalesce to super.getStartupConf() on parse error
      }
    }

    return super.getStartupConf();
  }
}

const pool = new Pool({
  Client: EnhancedClient,
  user: 'postgres',
  host: 'localhost',
  database: 'postgres',
  password: 'postgres',
  port: 5432
})


在该示例中,PG_OPTIONS是字符串化的JSON,例如经由命令行、PM2生态系统文件等提供。
例如:PG_OPTIONS='{"search_path":"DOCUMENT"}' node app.js
我从Windows命令提示符启动(对不起:))

SET PG_OPTIONS={"search_path":"DOCUMENT"}
node app.js

sigwle7e

sigwle7e3#

如果有人仍然感兴趣,您可以使用连接字符串和传递选项,而不仅仅是模式。

postgres://postgres:postgres@localhost:5432/my_db?options=-c search_path=my_schema

字符串

g52tjvyc

g52tjvyc4#

当您创建DB URL时,您可以像这样将schema附加到它:

`postgres://${dbUser}:${dbPass}@${dbHost}:${dbPort}/${dbName}?schema=${schema}`

字符串

cidc1ykv

cidc1ykv5#

自2016年以来一直开放的node-postgres中的Issue #1123是一个请求,用于向连接请求添加支持以指定当前模式。
这显然不能在短期内解决您的问题,但是如果这个特性请求得到实现,可以使用它来假设所有查询都应该针对给定的模式。

相关问题