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 升级到最新版本(如果不是)。
我有一个查询,其中 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 升级到最新版本(如果不是)。