У меня есть простая таблица (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
или подобных "внешних" инструментов).
На самом деле 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();
Knex не требует, чтобы вы использовали функции "построитель запросов". На самом деле, поскольку запросы усложняются, я настоятельно рекомендую НЕ использовать его... вы потратите гораздо больше времени, пытаясь склеить все функции вместе, а не просто выписывать SQL самостоятельно. Позвольте ему встретиться, в конце концов, knex просто выплевывает sql для вас. Тем не менее, что-то вроде этого должно работать:
return knex.raw('
select *
from datatable
where (idx, idy) IN ((1, 10), (2, 20)....)
');