PostgreSQL / NodeJS: результат запроса пуст

У меня есть запрос, который возвращает 0 строк, но выполнение того же запроса с использованием pgadmin или dbeaver возвращает набор результатов со строками.

Я заметил это, потому что у меня есть функция postgresql, которая должна возвращать строки, но не вернула. После этого я начал отладку.

Остальные запросы не затронуты. Я пробовал использовать knexjs (knex.raw()) и pg (client.query()).

Вне зависимости от причины, я десятки раз проверял соединение, используя разные запросы и читая строку подключения.

Это действительно странно.

Все дело в том, почему это работает в dbeaver, а не в моем коде. Это связано с драйверами?

Запросы

select id from (
    select id, started_at from queue 
    where finished_at is null and started_at is not null order by id
) d 
where date_part('minute',age(now(), started_at)) >= 5

Я много играл и обнаружил, что следующие запросы действительно работают.

select id from queue 
where date_part('minute',age(now(), started_at)) >= 5;

а также

select id from (
    select id, started_at from queue 
    where finished_at is null and started_at is not null order by id
) d;

Обновлять

не работает

const test = await this.knexInstance.raw(`
    select id from (
        select id, started_at from queue 
        where finished_at is null and started_at is not null order by id
    ) d 
    where date_part('minute',age(now(), started_at)) >= 5
`);
console.info(test.rows); // => []
console.info(test.rows.length); // => 0

за работой

const test = await this.knexInstance.raw(`
    select id from queue 
    where date_part('minute',age(now(), started_at)) >= 5;
`);
console.info(test.rows); // => Array(48083) [Object, Object, Object, Object, Object, Object, Object, Object, …]
console.info(test.rows.length); // => 48083

Можете ли вы также опубликовать фрагмент кода node.js?

Tuan Anh Tran 15.03.2018 10:30

Похоже, ваш код возвращает ответ раньше, тогда как фактический ответ от базы данных приходит поздно. Возможно, вам нужно поместить туда функцию обратного вызова, которая выполняется после результата, возвращенного из БД.

Hannan 15.03.2018 10:32

Я публикую код nodejs через секунду.

dknaack 15.03.2018 10:33

мой вопрос обновлен. Спасибо!

dknaack 15.03.2018 10:40

Попробуйте написать свой запрос без вложенности. Это так работает?

coockoo 16.03.2018 07:27

Оно делает. Но почему?

dknaack 16.03.2018 08:13

Думаю, это волшебство. Но если серьезно, то пока не могу понять. Очень странный случай. Я постараюсь еще раз взглянуть на это позже.

coockoo 16.03.2018 09:58

Пожалуйста, укажите версию knex, которую вы используете. Также я на 99,9% уверен, что knex не является причиной, по которой запрос не возвращает результаты. Этот sql передается напрямую драйверу pg.

Mikael Lepistö 19.03.2018 20:32
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
8
1 226
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Зачем напрямую использовать сырые?

const test = await this.knexInstance.select('queue')
             .columns(['id'])
             .whereRaw('date_part('minute',age(now(), started_at)) >= 5');

Я меньше знаю о PostgreSQL, но он должен работать.

Ответ принят как подходящий

Хорошо, я попытался воспроизвести это, но получил ожидаемый результат. Пользуюсь [email protected].

const knex = require('knex')(config)

async function main () {
    await knex.raw('create table queue ( id bigserial primary key, started_at timestamp with time zone not null default current_timestamp, finished_at timestamp with time zone);')
    await knex('queue').insert({ started_at: knex.raw('now() - \'10 minutes\'::interval'), finished_at: null })
    await knex('queue').insert({ started_at: knex.raw('now() - \'11 minutes\'::interval'), finished_at: null })
    await knex('queue').insert({ started_at: knex.raw('now() - \'12 minutes\'::interval'), finished_at: null })
    await knex('queue').insert({ started_at: knex.raw('now() - \'13 minutes\'::interval'), finished_at: null })

    await knex('queue').insert({ started_at: knex.raw('now() - \'4 minutes\'::interval'), finished_at: null })
    const test = await knex.raw(`
    select id from (
        select id, started_at from queue
        where finished_at is null and started_at is not null order by id
    ) d
    where date_part('minute',age(now(), started_at)) >= 5
`);
    console.info(test.rows) // Array(4)
    console.info(test.rows.length) // => 4 
    await knex.raw('drop table queue;') 
    await knex.destroy()
}

main()

Все, что я могу порекомендовать, - это попробовать запустить этот пример локально и посмотреть результаты. И попробуйте обновить knex до последней версии (если это не так).

Другие вопросы по теме