У меня есть запрос, который возвращает 0 строк, но выполнение того же запроса с использованием pgadmin или dbeaver возвращает набор результатов со строками.
Я заметил это, потому что у меня есть функция postgresql, которая должна возвращать строки, но не вернула. После этого я начал отладку.
Остальные запросы не затронуты.
Я пробовал использовать knexjs (knex.raw()) и pg (client.query()).
Вне зависимости от причины, я десятки раз проверял соединение, используя разные запросы и читая строку подключения.
Это действительно странно.
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
Похоже, ваш код возвращает ответ раньше, тогда как фактический ответ от базы данных приходит поздно. Возможно, вам нужно поместить туда функцию обратного вызова, которая выполняется после результата, возвращенного из БД.
Я публикую код nodejs через секунду.
мой вопрос обновлен. Спасибо!
Попробуйте написать свой запрос без вложенности. Это так работает?
Оно делает. Но почему?
Думаю, это волшебство. Но если серьезно, то пока не могу понять. Очень странный случай. Я постараюсь еще раз взглянуть на это позже.
Пожалуйста, укажите версию knex, которую вы используете. Также я на 99,9% уверен, что knex не является причиной, по которой запрос не возвращает результаты. Этот sql передается напрямую драйверу pg.





Зачем напрямую использовать сырые?
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 до последней версии (если это не так).
Можете ли вы также опубликовать фрагмент кода node.js?