PostgreSQL / NodeJS:查询结果为空

时间:2018-03-15 09:27:42

标签: node.js postgresql knex.js

我有一个返回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.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

2 个答案:

答案 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升级到最新版本(如果不是)。