Как отправить параметры в запросе COPY TO в node-postgres

Я делаю запрос для экспорта результатов в CSV в postgres, запущенном на сервере ubuntu.

Запрос вызывается из Node-API, который подключается к Postgres через node-postgres-driver (https://node-postgres.com/).

Запрос выглядит так:

var sqlText = 
   'Copy (SELECT company.name AS Company, SUM(sale.numbersold) AS NumberSold 
    FROM SALE LEFT JOIN company ON company.companyid = sale.companyid 
    WHERE sale.createdate BETWEEN $1 AND $2 GROUP BY company.name) 
    To \'/tmp/test.csv\' With CSV HEADER DELIMITER \',\'';

Всякий раз, когда я пытаюсь использовать этот запрос с параметрами, я получаю исключение, что postgres ожидал 0 параметров и получил 2. Как вы отправляете параметры в такой запрос?

Если я запрашиваю такой статический текст, он работает:

var sqlText = 'Copy (SELECT company.name AS Company, SUM(sale.numbersold) AS NumberSold 
FROM SALE LEFT JOIN company ON company.companyid = sale.companyid 
WHERE sale.createdate BETWEEN \'2018-01-01\' AND \'2018-01-01\' 
GROUP BY company.name) 
To \'/tmp/test.csv\' With CSV HEADER DELIMITER \',\'';

Код в узле:

var params = ['2018-01-01', '2018-01-28']

 let dbResult;
            try {
                    dbResult = await GetStuff(sqlText, params);
            } catch (err) {

            }

person klas mack    schedule 01.03.2018    source источник


Ответы (1)


COPY является служебным оператором и поэтому не поддерживает параметризованное выполнение.

Либо параметры следует вводить на стороне клиента, либо, если вы предпочитаете, вводить на стороне сервера с помощью динамического SQL, реализованного в функции.

Пример показан в Использование переменной функции в динамическом операторе COPY.

person Daniel Vérité    schedule 01.03.2018
comment
Хорошо, я боялся, что это так. Я попробую ввести это на стороне клиента. Спасибо за ваш ответ! - person klas mack; 01.03.2018