在pg-promise中设置每个用户的会话变量

时间:2020-02-03 06:57:26

标签: pg-promise

我正在尝试在pg-promise中的连接上设置会话级别变量,该变量值将由具有current_setting('var_name')的数据库级别的触发器读取。每个用户的会话变量都不同,而我也为所有用户共享相同的数据库连接。

我发现利用连接事件与此question有点相关,但是我担心,由于我为所有用户共享相同的连接,因此当不同的用户调用查询方法时,会话变量将无法正确设置

是否有另一种方法可以安全地设置此会话var,并确保在仍共享同一数据库对象的同时为每个用户隔离该会话var?

const pgPromise = pgp({
  promiseLib: Promise, // overriding the default (ES6 Promise)
  async connect(client, dc, useCount) {
    // const cp = client.connectionParameters;
    // console.log('Connected to database:', cp.database, dc);
    if (dc && dc.email) {
      console.log(useCount);
      const email = encodeURI(dc.email);
      await client.query(`SET SESSION "app.user" = '${email}'`);
    }
  }
});

get tenantDb() {
  const state = this.request.sessionState();
  const config = { host, database, port };
  // pass state as database context, 
  // we'll get warning of duplicate database object for the same connection
  const connection = pgPromise(config, state);
  return connection;
}

更新

事实证明,我需要将pg-promise版本升级到最新版本,我使用的是v7,它不会根据上下文区分连接对象,一旦我将pg-promise升级到v10,警告就会消失,如果我们可以在初始化数据库时以某种方式在initOptions参数中设置会话设置以及模式回调,则是一种更优化的解决方案,这样我们就只需要与模式一起执行一次额外的查询即可。

0 个答案:

没有答案
相关问题