如何使用knex

时间:2018-02-08 15:58:00

标签: javascript node.js postgresql knex.js

我有一个简单的表(PostgreSQL),它包含两个整数列,比如idxidy。我想使用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或类似的"外部"工具)。

2 个答案:

答案 0 :(得分:1)

实际上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();

答案 1 :(得分:0)

Knex并不要求您使用“查询”构建器'功能。事实上,随着查询变得越来越复杂,我强烈建议不要使用它...你会花费更多的时间将所有函数正确地粘合在一起,而不是自己编写SQL。让我们面对现实,在一天结束时,knex无论如何只是为你吐出sql。也就是说,这样的事情应该有效:

return knex.raw(`
    select *
    from datatable
    where (idx, idy) IN ((1, 10), (2, 20)....)
`);