PostgreSQL / NodeJS:查询结果为空

PostgreSQL / NodeJS: Query Result Empty

我有一个查询,其中 return 有 0 行,但使用 pgadmin 或 dbeaver 执行相同的查询 return 有一个包含行的结果集。

我注意到了这一点,因为我有一个 postgresql 函数,它应该 return 行但没有。之后我就开始调试了。

其他查询不受影响。 我尝试使用 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

为什么直接用raw?

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

我不太了解 PostgreSQL,但它应该可以工作。

好的,我尝试重现这个,但得到了预期的结果。我正在使用 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 升级到最新版本(如果不是)。