Запрос Sequelize сломался - PullRequest
0 голосов
/ 02 мая 2020

Я повторно посетил запрос, который написал пару дней go, и, как и следовало ожидать, он чудесным образом сломался.
В основном он состоит из этого:

...
        let filter = req.body.filter;
        let filter_value = req.body.filter_value;       
        let filter_from = req.body.filter_from;
        let filter_to = req.body.filter_to;

        let filterSystem = (filter === "createdAt") ?
                {[filter]:{
                    [Op.or]:[
                        filter_value,
                        {[Op.between]:[filter_from,filter_to]},
                        {[Op.between]:[filter_from,filter_value]},
                        {[Op.between]:[filter_value,filter_to]}
                    ]
                }} 
            : (filter === "favorites") ? 
                {[filter]:filter_value} 
            : {};

        let results = await Promise.all([ 
            await models.bookmark.findAll({
                attributes:[
                    'guid',
                    'link',
                    'createdAt',
                    'description',
                    'favorites'
                ],
                ...
                where:filterSystem
            })              
        ])

        res.json({ 
            length: results[0].length,
            data: results[0]
        })
    ...

Использование Почтальона для ввода данных к телу я могу видеть запрос go через консоль:

Если я введу даты «filter_from» и «filter_value» и пропущу все, кроме блока [filter_from, filter_value] -

Executing (default): SELECT `guid`, `link`, `createdAt`, `description`, `favorites` FROM `bookmarks` AS `bookmark` WHERE `bookmark`.`createdAt` BETWEEN '2020-04-30T15:34:48.877Z' AND '2020-04-30T15:37:00.170Z' ORDER BY `bookmark`.`createdAt` ASC LIMIT 0, 50;

Все, что он возвращает - пустой массив.

Если присутствуют все параметры поиска -

SELECT `guid`, `link`, `createdAt`, `description`, `favorites` FROM `bookmarks` AS `bookmark` WHERE (`bookmark`.`createdAt` BETWEEN '2020-04-30T15:34:48.877Z' AND NULL OR `bookmark`.`createdAt` BETWEEN '2020-04-30T15:34:48.877Z' AND '2020-04-30T15:37:00.170Z' OR `bookmark`.`createdAt` BETWEEN '2020-04-30T15:37:00.170Z' AND NULL) ORDER BY `bookmark`.`createdAt` ASC LIMIT 0, 50;

Возвращает только результат, соответствующий filter_value, хотя должен быть около 6.

Поиск без каких-либо фильтров возвращает все 8 результатов, используя «избранное» и «true» для «filter» и «filter_value» соответственно, работает отлично.

При создании запрос, я следовал за этим Запрос по диапазону дат для поля столбца в Sequelize
Что может ошибаться go - ISO 8601 устарел в одночасье? Но это формат, в котором база хранит все даты. Также не получая предупреждений / ошибок в консоли.

1 Ответ

0 голосов
/ 03 мая 2020

После некоторой переделки я вообще опустил [Op.between] и переключился на

        where:{
            [filter]:{
                [Op.and]:[
                    {[Op.gt]:filter_from},
                    {[Op.lt]:filter_to}
                ]
            }
        }

И теперь он работает.
Просто оставьте это здесь, на случай, если у кого-то возникнет аналогичная проблема.
В конце мне понадобились объекты для сравнения, и кажется, что Op.between не имеет их поддержки - но Op.and / или, конечно, есть.

...