我在创建客户端时专门搜索pg-promise的文档。但我无法找到设置要在连接中使用的默认架构的选项,它始终使用public
架构。我该如何设置?
答案 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
替换为事件connect的useCount
,因此最好只使用最新版本和选项schema
。