如何在pg-promise中设置模式

时间:2017-01-18 22:58:55

标签: javascript postgresql pg-promise node-postgres

我在创建客户端时专门搜索pg-promise的文档。但我无法找到设置要在连接中使用的默认架构的选项,它始终使用public架构。我该如何设置?

1 个答案:

答案 0 :(得分:3)

通常,可以设置数据库或角色的默认架构,如下所述:

只有在没有持久更改的情况下才能执行此操作,您可能希望动态设置架构,仅适用于当前流程。

您可以在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);

从版本8.3.0开始,该库支持Initialization Options中的选项schema

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

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

可以更轻松地设置动态架构。

<强>实施例

  • 使您的自己的架构与默认的public架构一起显示:

    const initOptions = {
        schema: ['public', 'my_schema'] /* make both schemas visible */
    };
    
    const pgp = require('pg-promise')(initOptions);
    
  • 使用回调基于数据库上下文设置模式(请参阅Database构造函数):

    const initOptions = {
        schema: dc => {
            if(dc === /* whatever database context was used */) {
                return 'my_schema'; /* or an array of strings */
            }
            /* other provisions, if multiple databases are used. */
    
            /* or can return nothing, if no schema change is needed. */
        }
    };
    
    const pgp = require('pg-promise')(initOptions);
    

<强>更新

Version 8.4.0将参数isFresh替换为事件connectuseCount,因此最好只使用最新版本和选项schema