JestJs: как исправить запрос с литералом шаблона для работы с Jest - PullRequest
0 голосов
/ 26 июня 2019

У меня есть рабочий запрос в MySQL, но при тестировании Jest выдает следующую ошибку:

У вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MariaDB, на предмет правильного синтаксиса для использования около

FROM(SELECT

                            f.user' at line 4

пустая строка между SELECT и f.user - это шаблон $ {querySubSelect} но по какой-то причине Джест не прочитал ссылку на querySubSelect.
поэтому запрос должен выглядеть так:

FROM (SELECT SUBSTRING(SUBSTRING(f.answers, 1, 2), 2) AS Answer1, 
 SUBSTRING(SUBSTRING(f.answers, 2, 3), 3) AS Answer2, 
 SUBSTRING(SUBSTRING(f.answers, 3, 4), 4) AS Answer3, 
 SUBSTRING(SUBSTRING(f.answers, 4, 5), 5) AS Answer4, 
 SUBSTRING(SUBSTRING(f.answers, 5, 6), 6) AS Answer5, 
 f.userid,....

и мой полный запрос:

let querySelect = ``
    for (var i = 1; i <= answersLength; i++) {
        if (i == answersLength) {//last entry should be without ","
            querySelect += `ROUND(AVG(Answer${i}), 1) AS avg${i} `
        } else {
            querySelect += `ROUND(AVG(Answer${i}), 1) AS avg${i}, `
        }
    }
    //set yo the Sub select parameter for query
    let querySubSelect = ``
    for (var i = 1; i <= answersLength; i++) {
        querySubSelect += `SUBSTRING(SUBSTRING(f.answers, ${i}, ${i + 1}), ${i + 1}) AS Answer${i},`
    }
    const counselorAvgAnswer = await UserModel.sequelize.query(`
            SELECT
                name, ${querySelect}
            FROM
                (SELECT
                    ${querySubSelect}
                        f.userid AS clientid
                FROM
                    user AS u, feedback AS f
                WHERE
                    u.id = f.userid
                        AND u.role IN ('counsellor' , 'leader')) AS feedbackSubQuery,
                user AS user
            WHERE
                clientid = user.id
            GROUP BY clientid
            ORDER BY name ASC`)
        .then(e => { return e[0] })

запрос отлично работает в моем коде, но когда я запускаю тесты Jest, он прерывает все тесты с той же ошибкой, которую я поставил сверху

1 Ответ

0 голосов
/ 25 июля 2019

до сих пор не знаю, в чем была проблема, но я решил это так: переключая порядок заголовка запроса / выберите

    let querySelect = ``
    for (var i = 1; i <= answersLength; i++) {
        querySelect += `ROUND(AVG(Answer${i}), 1) AS avg${i},`
    }
    //set yo the Sub select parameter for query
    let querySubSelect = ``
    for (var i = 1; i <= answersLength; i++) {
    //the substring function is to take the acutal number from the array inside the string 'f.answers'
        querySubSelect += `SUBSTRING(SUBSTRING(f.answers, ${i}, ${i + 1}), ${i + 1}) AS Answer${i},`
    }
    // }
    const counselorAvgAnswer = await UserModel.sequelize.query(`
            SELECT
                ${querySelect}
                name
            FROM
                (SELECT
                    ${querySubSelect}
                    f.userid AS clientid
                FROM
                    user AS u, feedback AS f
                WHERE
                    u.id = f.userid
                        AND u.role IN ('counsellor' , 'leader')) AS feedbackSubQuery,
                user AS user
            WHERE
                clientid = user.id
            GROUP BY clientid
            ORDER BY name ASC`)
        .then(e => { return e[0] })
        .catch(function(err) {
            console.log(err);
        });
    return counselorAvgAnswer
...