1 Frage: Knex, Postgres und STRING_ARRAY: unterschiedliche Ergebnisse erzielen

Frage erstellt am Wed, May 8, 2019 12:00 AM

Ich habe hier eine Abfrage mit STRING_ARRAY getestet: http://sqlfiddle.com/# ! 17/952405/1

Auch hier:

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

Das oben Genannte funktioniert wie erwartet. Wenn ich das jedoch mit Knex auf meinem Node.JS /Express-Server ausführe, erhalte ich eine merkwürdige Antwort.

Hier ist der Code:

//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);

Ich habe die gleiche Ausgabe erwartet wie oben bei sqlfiddle. Ich habe dies jedoch zurückbekommen (Hinweis: Die erwarteten Daten sollten den Wert für den 'Workshops'-Schlüssel darstellen:

{
"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
}

}

Ich habe ein bisschen gesucht und festgestellt, dass dies das Format ist, das INSERT-Abfragen normalerweise für Node-Postgres zurückgeben, aber ich habe noch keine Lösung gefunden. Irgendwelche Ideen?

    
0
1 Antworten                              1                         

Anscheinend gibt Ihre Funktion findParentWorkshops (einen Teil) der Abfragedefinition und nicht das Abfrageergebnis zurück. Es wird also nicht ausgeführt.

Im Folgenden habe ich es explizit in ein Versprechen eingeschlossen und return-Anweisungen eingefügt, und es wird ausgeführt, um ein Ergebnis zu erzeugen. Ich verwende Node V6. Vielleicht funktioniert Ihre neuere Version etwas anders, oder Sie verwenden Bluebird für Ihre Versprechen?

Beachten Sie auch die .on('query'-Klausel. Ich benutze dies beim Debuggen. Es stellt sicher, dass die generierte SQL meinen Erwartungen entspricht, und es zeigt, dass die Abfrage tatsächlich ausgeführt wird.

Ich lasse die .on('query-error'-Klausel für gute Hinweise zu Laufzeitfehlern, logge mich aber tatsächlich über einen dateibasierten Mechanismus.

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
Quelle platziert Hier