Как всегда фильтровать столбец по умолчанию в Knex / Postgres? - PullRequest
0 голосов
/ 02 октября 2019

Когда мы удаляем данные, часто вместо того, чтобы удалять строку БД, мы вместо этого устанавливаем столбец date_deleted (для данных, не связанных с конфиденциальностью), чтобы данные были доступны позже для аудита при необходимости.

Как мы можем использовать Objection, Knex или Postgres для предварительной фильтрации этого столбца всегда (если он существует) и в противном случае возвращать все строки? (Мы только хотим посмотреть на эти столбцы вручную, а не через код.)

Похоже, что postProcessResponse будет хорошо работать в Knex - мы просто фильтруем возвращаемые строки, проверяя date_deleted. Но это, конечно, было бы более эффективно, если бы мы могли найти способ всегда фильтровать до запроса, а не после получения результатов.

1 Ответ

1 голос
/ 03 октября 2019

Использование postProcessResponse приведет к различным проблемам с подкачкой и т. Д.

Вы можете использовать событие start для изменения каждого запроса:

knex.on('start', function(builder) {
    builder.whereNull('date_deleted')
});

knex.select('*')
  .from('users')
  .then(function(Rows) {
    //Only contains Rows where date_deleted is null
  });

Но это также весьма подвержено ошибкамНапример, если вы используете .orWhere в своем запросе или для любого другого запроса, который не является простым, выберите ...

Функция, которую вы ищете, не очень удобна для реализации с knex. Например, с objection.js есть гораздо больше вариантов, как это сделать.

Для knex я, вероятно, просто расширил бы конструктор запросов специальной функцией, которая выполняет что-то вроде этого (начиная с knex 0.19.1):

const Knex = require('knex');

Knex.QueryBuilder.extend('selectWithoutDeleted', function(tableName) {
  return this
    .with('tableWithoutDeleted',
      knex(tableName).whereNull('date_deleted')
    )
    .from('tableWithoutDeleted');
});

const res = await knex.selectWithoutDeleted('table')
  .where('col1', 'foo')
  .orWhere('col2', 'bar');

Это должно работать теоретически ... CTE сначала ограничивает результаты не содержащими удаленные строки, а остальные условия where будут применяться к этому ограниченному набору результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...