Как запросить пары с knex

1

У меня есть простая таблица (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.js

2 ответа

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();
  • 0
    идеально, кажется, это именно то, что я искал :)
0

Knex не требует, чтобы вы использовали функции "построитель запросов". На самом деле, поскольку запросы усложняются, я настоятельно рекомендую НЕ использовать его... вы потратите гораздо больше времени, пытаясь склеить все функции вместе, а не просто выписывать SQL самостоятельно. Позвольте ему встретиться, в конце концов, knex просто выплевывает sql для вас. Тем не менее, что-то вроде этого должно работать:

return knex.raw('
    select *
    from datatable
    where (idx, idy) IN ((1, 10), (2, 20)....)
');
  • 1
    И это отличный пример того, как начать писать ошибки SQL-инъекций в ваш код, если вы на самом деле просто не передаете предопределенные идентификаторы в свой запрос. Я настоятельно рекомендую не использовать knex.raw. Обычно не так сложно писать даже сложные запросы в формате построителя запросов. Просто добавьте knex.raw к тем частям запросов, где это действительно необходимо.
  • 0
    Вы также можете добавить привязку параметров к этому запросу. Да, если делать это таким образом, если входные данные поступают от пользователя, определенно не захочет делать это таким образом (то есть без привязки параметров).
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню