Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用knex查询配对_Javascript_Node.js_Postgresql_Knex.js - Fatal编程技术网

Javascript 如何使用knex查询配对

Javascript 如何使用knex查询配对,javascript,node.js,postgresql,knex.js,Javascript,Node.js,Postgresql,Knex.js,我有一个简单的表(PostgreSQL),它包含两个整数列,例如,idx和idy。我想使用knex查询它,以获得与规定的组合列表idx/idy对应的所有行,例如,生成一个查询,例如: select * from "datatable" where (idx, idy) IN (('1', '10'), ('2', '20')) Knex确实提供了该方法,但它似乎不支持多个列。我通过以下方式实现了目标: const knex_conf = require('./knexfile'); const

我有一个简单的表(PostgreSQL),它包含两个整数列,例如,
idx
idy
。我想使用knex查询它,以获得与规定的组合列表
idx/idy
对应的所有行,例如,生成一个查询,例如:

select * from "datatable" where (idx, idy) IN (('1', '10'), ('2', '20'))
Knex确实提供了该方法,但它似乎不支持多个列。我通过以下方式实现了目标:

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);

但我想知道是否会有一个更优雅的解决方案(不需要使用或类似的“外部”工具)。

Knex不要求您使用“查询生成器”功能。事实上,随着查询变得越来越复杂,我强烈建议不要使用它。。。您将花费更多的时间尝试将所有函数正确地粘合在一起,而不仅仅是自己编写SQL。让我们面对现实吧,最终,knex只是在为您吐出sql。这就是说,类似这样的方法应该有效:

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

实际上,knex已经支持这一点:


这是一个很好的例子,说明了如何开始向代码中写入SQL注入错误,除非您只是将预定义的ID传递给查询。我强烈建议不要使用knex.raw。通常,用查询生成器格式编写甚至相当复杂的查询其实并不难。只需将knex.raw添加到真正需要的查询部分。您也可以将参数绑定添加到此查询。是的,如果输入来自用户,则允许这样做,但肯定不希望这样做(即不进行参数绑定)。此外,与从driver.perfect返回的数据中提取行的query builder相比,knex.raw的结果使用起来稍微不方便,这似乎正是我想要的:)
const Knex = require('knex');
const knex = Knex({
  client: 'pg'
});
const pairs = [ [1, 10], [2, 20] ];
knex('datatable').whereIn(['idx','idy'], pairs).toSQL();