1 Pytanie: Knex, Postgres i STRING_ARRAY: uzyskiwanie różnych wyników

pytanie utworzone w Wed, May 8, 2019 12:00 AM

Testowałem tutaj zapytanie za pomocą STRING_ARRAY: http://sqlfiddle.com/# ! 17/952405/1

Także tutaj:

SELECT   to_char(workshop_date, 'YYYY-MM-DD') date, STRING_AGG(first_name || ' ' || last_name, ', ')
FROM     parents_workshops
JOIN     parents ON parents.id = ANY(parents_workshops.parents_id)
WHERE    teacher_id = 1
GROUP BY date

Powyższe działa zgodnie z oczekiwaniami. Jednak gdy uruchomię to na moim serwerze Node.JS /Express za pomocą Knex, otrzymam dziwną odpowiedź.

Oto kod:

//teachers.js

const findParentWorkshops = id =>
    knex.raw(
        `SELECT to_char(workshop_date, 'YYYY-MM-DD') date, STRING_AGG(first_name || ' ' || last_name, ', ')FROM parents_workshops
        JOIN parents ON parents.id = ANY (parents_workshops.parents_id)
        WHERE teacher_id = ${id} GROUP BY date`
    );

//teacherController.js

const getParentWorkshops = (req, res, next) => {
    const teacherId = req.params.id;

    Teacher.findParentWorkshops(teacherId)
        .then(workshops => {    
            res.status(200).json({
                ok: true,
                status: 200,
                message: `Parents' workshops found`,
                length: workshops.length,
                workshops,
            });
        })
        .catch(next);
};

//teacherRoutes.js

router
    .route(`/teachers/:id/parents-workshops`)
    .get(getParentWorkshops)
    .post(postParentWorkshop);

Spodziewałem się tego samego wyjścia, co z sqlfiddle powyżej. Jednak otrzymałem to (NB, oczekiwane dane powinny być wartością dla klucza „warsztaty”:

{
"ok": true,
"status": 200,
"message": "Parents' workshops found",
"workshops": {
"command": "SELECT",
"rowCount": 0,
"oid": null,
"rows": [],
"fields": [
{
"name": "date",
"tableID": 0,
"columnID": 0,
"dataTypeID": 25,
"dataTypeSize": -1,
"dataTypeModifier": -1,
"format": "text"
},
{
"name": "string_agg",
"tableID": 0,
"columnID": 0,
"dataTypeID": 25,
"dataTypeSize": -1,
"dataTypeModifier": -1,
"format": "text"
}
],
"_parsers": [
null,
null
],
"RowCtor": null,
"rowAsArray": false
}

}

Przeszukałem trochę i odkryłem, że jest to format, który kwerendy INSERT zwykle zwracają dla post -resów węzłów, jednak nie znalazłem jeszcze rozwiązania. Jakieś pomysły?

    
0
1 odpowiedzi                              1                         

Wydaje się, że Twoja funkcja findParentWorkshops zwraca (część) definicję zapytania, a nie wynik zapytania. Więc tak naprawdę nie działa.

Poniżej jawnie zapakowałem to w obietnicę i uwzględniłem instrukcje return i wykonuje ono wynik. Używam węzła v6, być może twoja nowsza wersja działa trochę inaczej lub używasz bluebirda dla swoich obietnic?

Zwróć również uwagę na klauzulę .on('query'. Używam tego podczas debugowania. Zapewnia to, że wygenerowany SQL jest tym, czego oczekuję, i pokazuje, że zapytanie jest faktycznie wykonywane.

Pozostawiam klauzulę .on('query-error' na dobre wskazówki dotyczące błędów w czasie wykonywania, ale faktycznie loguję się za pomocą mechanizmu opartego na plikach.

function findParentWorkshops(id) {
    console.log('Debug 00 .findParentWorkshops');

    return Promise.resolve()
        .then( function() { 
            console.log('Debug 01');
            return db.raw( `SELECT to_char(workshop_date, 'YYYY-MM-DD') date, STRING_AGG(first_name || ' ' || last_name, ', ')FROM parents_workshops
                JOIN parents ON parents.id = ANY (parents_workshops.parents_id)
                WHERE teacher_id = ? GROUP BY date` , [id]) 
                // debug error reporting, remove for production.
                .on('query', function(data) {
                    console.log('Debug81 query:', data);
                })
                // runtime error reporting, execution is not interrupted.
                .on('query-error', function(ex, obj) {
                    console.log("Error89 .on.query-error", {"obj":obj, "ex":ex} );
                })
        })
};
    
0
2019-05-09 18: 09: 58Z
źródło umieszczone tutaj