我有一个返回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.log(test.rows); // => []
console.log(test.rows.length); // => 0
const test = await this.knexInstance.raw(`
select id from queue
where date_part('minute',age(now(), started_at)) >= 5;
`);
console.log(test.rows); // => Array(48083) [Object, Object, Object, Object, Object, Object, Object, Object, …]
console.log(test.rows.length); // => 48083
答案 0 :(得分:1)
为什么直接使用raw?
const test = await this.knexInstance.select('queue')
.columns(['id'])
.whereRaw('date_part('minute',age(now(), started_at)) >= 5');
我对PostgreSQL的了解不多,但它应该有效。
答案 1 :(得分:1)
好的,我试图重现这个,但得到了预期的结果。我使用knex@0.14.4
。
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.log(test.rows) // Array(4)
console.log(test.rows.length) // => 4
await knex.raw('drop table queue;')
await knex.destroy()
}
main()
我可以推荐的是尝试在本地运行此示例并观察结果。并尝试将knex升级到最新版本(如果不是)。