【问题标题】:Can I set the search_path (or default schema) for a connection in pg-promise?我可以为 pg-promise 中的连接设置 search_path(或默认模式)吗?
【发布时间】:2018-04-19 22:34:39
【问题描述】:

如果我可以使用 pg-promise 设置用于连接的默认架构,那就太好了。

我尝试过的

我发现在某些语言中可以将 ?searchpath=<schema> 添加到连接字符串以将 <schema> 设置为后续查询的默认架构,但这在 pg-promise 中不起作用。

我也试过这样的:

const database = pgp(connectionString); // connectionString defined earlier, obviously
database.none('SET search_path TO ${schema}`, { schema: '<schema>' });

...但这似乎也不会影响后续查询。

我还发现this related question 没有可接受的答案,并且在 cmets 中似乎建议将其设置在用户级别,我无权执行此操作,或者上述设置,这没有似乎不适合我。

我发现 this question 最终有一个不同的问题作为根本原因。

换句话说:还有什么我可以尝试的,或者我上面提到的解决方案之一是否应该有效,如果可以,如何?

【问题讨论】:

标签: javascript pg-promise


【解决方案1】:

我还发现 this related question 没有可接受的答案,并且似乎在 cmets 中建议了上述内容,这似乎对我不起作用。

为什么没有呢?这是正确的解决方案,setting the schema search path at the user level。你应该朝着这个方向坚持下去。

pg-promise 允许您在运行时设置架构,在事件 connect 内,但您最终会在每个新连接上执行额外的查询:

const schema = 'my_schema';

const initOptions = {
    connect: (client, dc, isFresh) => {
        if(isFresh) {
            client.query(`SET search_path TO ${schema}`);
        }
    }
};

const pgp = require('pg-promise')(initOptions);

上面的代码示例有点像pg-promise 允许的hack,而不是使用该库的常见做法,因为它直接对驱动程序执行查询,并且没有任何错误处理,因为在那里处理错误赢了对任务或事务没有任何影响。因此,您必须小心避免在此处执行任何可能引发错误的查询。

UPDATE-1

库的Version 8.3.0 开始自动支持此功能:

const initOptions = {
    schema: 'my_schema' // can also be an array of strings
};

const pgp = require('pg-promise')(initOptions);

UPDATE-2

8.3.2 版还开始支持获取数据库上下文的回调函数(请参阅Database 构造函数),因此它可以根据上下文返回架构,从而可以在使用时正确设置架构一个模块中的不同数据库。

const initOptions = {
    schema: dc => {
        if(dc === /* whatever database context was used */) {
            return 'my_schema';
        }
        // other provisions, if multiple databases are used.

        // or can return nothing, if no schema change is needed.
    }
};

const pgp = require('pg-promise')(initOptions);

UPDATE-3

Version 8.4.0 将参数 isFresh 替换为 useCount 用于事件 connect,因此动态模式最简单的方法是使用选项 schema

【讨论】:

  • 啊,哎呀 - 忘了提。用户和数据库是自动为我配置的(不确定我是否使用了正确的术语),所以据我所知,我无法在用户级别设置它。额外的查询听起来确实不完美,但可能已经足够好了——我会试一试,然后在这里报告。谢谢!
  • @Vincent 你这么久才回来,库开始自动支持这个功能了:)
  • 我什至在看到这条评论之前就已经看到了——太棒了! (这需要很长时间,因为它是从数据库提供商转换的调查的一部分,所以我要同时解决一大堆相互关联的问题 :))
  • @Vincent 在v8.3.2 中工作得更好;)
猜你喜欢
  • 1970-01-01
  • 2017-10-10
  • 1970-01-01
  • 2016-11-30
  • 2017-06-03
  • 2011-03-17
  • 2012-08-13
  • 1970-01-01
  • 2011-04-05
相关资源
最近更新 更多