Javascript 如何使用knex查询配对
我有一个简单的表(PostgreSQL),它包含两个整数列,例如,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
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();