Получить версию сервера PostgreSQL из соединения? - PullRequest
0 голосов
/ 06 ноября 2019

Есть ли в современном протоколе соединения PostgreSQL что-нибудь, что указывало бы на версию сервера?

А если нет, то существует ли специальный низкоуровневый запрос, который конечная точка может выполнить для открытого соединения, чтобы вытащить сервердетали, которые будут содержать версию?

Я смотрю на возможное расширение node-postgres , которое будет автоматически предоставлять версию сервера при каждом новом соединении. И я хочу знать, возможно ли это вообще.

Необходимость выполнения SELECT version() при каждом новом соединении и последующем его анализе - слишком высокий уровень для базового драйвера, который управляет соединением. Это должно быть сделано на уровне протокола.

1 Ответ

1 голос
/ 06 ноября 2019

После небольшого исследования я обнаружил, что PostgreSQL предоставляет версию сервера во время соединения, в пределах стартового сообщения .

И особенно в node-postgres драйвер, мы можем сделать Пул предоставить пользовательский Клиент , который обрабатывает событие 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);

На моемТестовый ПК Я использую PostgreSQL v11.2, поэтому этот тест выводит:

Server Version: 11.2

ОБНОВЛЕНИЕ

Библиотека pg-обещание обновлено доПоддержка той же функциональности в TypeScript. И вы можете найти полный пример в этот билет .

...