从连接获取 PostgreSQL 服务器版本?

vit*_*y-t 3 postgresql node-postgres

现代 PostgreSQL 连接协议中是否有任何内容可以指示服务器版本?

如果没有,是否存在端点可以针对开放连接执行的特殊低级请求,以提取包含该版本的服务器详细信息?

我正在研究node-postgres的可能扩展,它会在每次新连接时自动提供服务器版本。我想知道这是否可能。

对于管理连接的基本驱动程序来说,必须SELECT version()在每个新连接上执行然后解析它,级别太高了。它应该在协议级别完成。

vit*_*y-t 5

经过一番研究,我发现 PostgreSQL 确实在连接期间的启动消息中提供了服务器版本。

特别是在node-postgres驱动程序中,我们可以让Pool提供一个自定义客户端来处理parameterStatus连接上的事件,并公开服务器版本:

const {Client, Pool} = require('pg');

class MyClient extends Client {
    constructor(config) {
        super(config);
        this.connection.on('parameterStatus', msg => {
            if (msg.parameterName === 'server_version') {
                this.version = msg.parameterValue;
            }
        });
    }
}

const cn = {
    database: 'my-db',
    user: 'postgres',
    password: 'bla-bla',
    Client: MyClient // here's our custom Client type
};

const pool = new Pool(cn);

pool.connect()
    .then(client => {
        console.log('Server Version:', client.version);
        client.release(true);
    })
    .catch(console.error);
Run Code Online (Sandbox Code Playgroud)

在我的测试 PC 上,我使用 PostgreSQL v11.2,因此此测试输出:

Server Version: 11.2
Run Code Online (Sandbox Code Playgroud)

更新 - 1

pg-promise已更新以支持 TypeScript 中的相同功能。您可以在此票证中找到完整的示例。

更新 - 2

请参阅此处的示例

Server Version: 11.2
Run Code Online (Sandbox Code Playgroud)