Knex + SQL Server, где в запросе 8-12s - необработанная версия не возвращает результатов, но если я ввожу результат .toQuery () напрямую, я получаю результаты - PullRequest
1 голос
/ 02 мая 2019

База данных находится в облаке Azure и в настоящее время не используется в рабочей среде.Есть 80 000 строк, и uprn - это VARCHAR (100);

Я уже использую JOI для проверки каждого UPRN;

Я использую KNEX с базой данных SQL Server сследующий запрос whereIn:

knex(LOCATIONS.table).whereIn(LOCATIONS.uprn, req.body.uprns)

, но для его завершения требуется 8-12 с, а иногда и время ожидания.если я использую .toQuery () для той же вещи, SSMS вернет результат в течение 1-2.

Если я сделаю необработанный запрос, результирующие .toQuery () или toString () будут работать в SSMS и возвращатьРезультаты.Но если я попытаюсь использовать raw напрямую, он вернет 0 результатов.

Я ищу либо исправить то, что делает whereIn таким медленным, либо получить необработанный запрос.

EDIT 1:

После долгих отладок и попыток - похоже, ошибка связана с тем, как knex работает с массивами, поэтому я сделал цикл for для добавления???для каждого элемента массива, а затем введите массив для всех параметров.

Это привело меня к осознанию того, что проблема производительности связана с параметризацией на SQL-сервере.

В итоге я создал необработанную строку запроса со всеми параметрами и проверил ввод с помощью конфигурации Joi string / regex:

 Joi.string()
            .min(1)
            .max(35)
            .regex(/^[a-z\d\-_\s]+$/i)

, допускающей только алфавитно-цифровые символы, тире и пробелы, которые должны помешатьsql впрыск.

Я собираюсь глубже разобраться с проблемами безопасности и могу сделать отдельный вход в систему, который может только ВЫБРАТЬ данные из этой таблицы и больше ничего не выполнять с этими запросами.

...