现代PostgreSQL连接协议中是否有任何内容可以指示服务器版本?
如果没有,那么是否存在一个特殊的低级请求,端点可以针对打开的连接执行该请求以提取包含该版本的服务器详细信息?
我正在寻找node-postgres的可能扩展名,该扩展名将在每次新连接时自动提供服务器版本。我想知道这是否完全可能。
必须在每个新连接上执行SELECT version()
,然后对其进行解析,这对于管理该连接的基本驱动程序来说太高级了。应该在协议级别上完成。
现代PostgreSQL连接协议中是否有任何内容可以指示服务器版本?
如果没有,那么是否存在一个特殊的低级请求,端点可以针对打开的连接执行该请求以提取包含该版本的服务器详细信息?
我正在寻找node-postgres的可能扩展名,该扩展名将在每次新连接时自动提供服务器版本。我想知道这是否完全可能。
必须在每个新连接上执行SELECT version()
,然后对其进行解析,这对于管理该连接的基本驱动程序来说太高级了。应该在协议级别上完成。
经过一番研究,我发现PostgreSQL确实在start-up message内提供了连接期间的服务器版本。
特别是在node-postgres驱动程序中,我们可以使Pool提供一个自定义Client来处理连接上的事件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);
在我的测试PC上,我使用PostgreSQL v11.2,因此此测试输出:
Server Version: 11.2
更新
库pg-promise已更新,以支持TypeScript中的相同功能。您可以在this ticket中找到完整的示例。