如何使用 knex 查询对
How to query pairs with knex
我有一个简单的 table (PostgreSQL),它包含两个整数列,例如 idx
和 idy
。我想使用 knex 来查询它以获得与规定的组合列表 idx/idy
相对应的所有行,例如生成如下查询:
select * from "datatable" where (idx, idy) IN (('1', '10'), ('2', '20'))
Knex 确实提供了whereIn
方法,但是它似乎不支持多列。我设法通过以下方式实现了结果:
const knex_conf = require('./knexfile');
const knex = require('knex')(knex_conf.development);
const pgFormat = require('pg-format');
const pairs = [ [1, 10], [2, 20] ];
var P = knex.table('datatable').whereRaw(`(idx,idy) IN ${pgFormat('(%L)',pairs)}`).toSQL();
console.log(P.sql);
但我想知道是否会有更优雅的解决方案(无需使用 pg-format
或类似的 "external" 工具)。
Knex 不要求您使用 'query builder' 功能。事实上,随着查询变得越来越复杂,我强烈建议不要使用它……与仅自己编写 SQL 相比,您将花费更多时间尝试将所有函数正确粘合在一起。让我们面对现实吧,无论如何,knex 只是为你吐出 sql。也就是说,这样的事情应该有效:
return knex.raw(`
select *
from datatable
where (idx, idy) IN ((1, 10), (2, 20)....)
`);
其实knex已经支持这个了:
https://runkit.com/embed/f2wym1fwfrn1
const Knex = require('knex');
const knex = Knex({
client: 'pg'
});
const pairs = [ [1, 10], [2, 20] ];
knex('datatable').whereIn(['idx','idy'], pairs).toSQL();
我有一个简单的 table (PostgreSQL),它包含两个整数列,例如 idx
和 idy
。我想使用 knex 来查询它以获得与规定的组合列表 idx/idy
相对应的所有行,例如生成如下查询:
select * from "datatable" where (idx, idy) IN (('1', '10'), ('2', '20'))
Knex 确实提供了whereIn
方法,但是它似乎不支持多列。我设法通过以下方式实现了结果:
const knex_conf = require('./knexfile');
const knex = require('knex')(knex_conf.development);
const pgFormat = require('pg-format');
const pairs = [ [1, 10], [2, 20] ];
var P = knex.table('datatable').whereRaw(`(idx,idy) IN ${pgFormat('(%L)',pairs)}`).toSQL();
console.log(P.sql);
但我想知道是否会有更优雅的解决方案(无需使用 pg-format
或类似的 "external" 工具)。
Knex 不要求您使用 'query builder' 功能。事实上,随着查询变得越来越复杂,我强烈建议不要使用它……与仅自己编写 SQL 相比,您将花费更多时间尝试将所有函数正确粘合在一起。让我们面对现实吧,无论如何,knex 只是为你吐出 sql。也就是说,这样的事情应该有效:
return knex.raw(`
select *
from datatable
where (idx, idy) IN ((1, 10), (2, 20)....)
`);
其实knex已经支持这个了:
https://runkit.com/embed/f2wym1fwfrn1
const Knex = require('knex');
const knex = Knex({
client: 'pg'
});
const pairs = [ [1, 10], [2, 20] ];
knex('datatable').whereIn(['idx','idy'], pairs).toSQL();