1 Question: Knex, Postgres et STRING_ARRAY: obtenir des résultats différents

question créée à Wed, May 8, 2019 12:00 AM

Je testais une requête ici avec STRING_ARRAY: http://sqlfiddle.com/# ! 17/952405/1

Aussi ici:

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

Ce qui précède fonctionne comme prévu. Cependant, lorsque je l’utilise sur mon serveur Node.JS /Express avec Knex, j’obtiens une réponse étrange.

Voici le code:

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

Je m'attendais à la même sortie que celle du sqlfiddle ci-dessus. Cependant, j'ai récupéré (NB, les données attendues devraient correspondre à la valeur de la clé 'ateliers':

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

}

J'ai un peu cherché et trouvé que c'est le format que les requêtes INSERT renvoient généralement pour node-postgres, mais je n'ai pas encore trouvé de solution. Des idées?

    
0
1 Réponses                              1                         

Il semble que votre fonction findParentWorkshops renvoie (en partie) la définition de la requête, plutôt que le résultat de la requête. Donc, ce n’est pas réellement en cours d’exécution.

Ci-dessous, je l'ai explicitement emballé dans une promesse et j'ai inclus les instructions return. Il s'exécute en produisant un résultat. J'utilise le nœud v6, peut-être que votre version la plus récente fonctionne un peu différemment ou que vous utilisez bluebird pour vos promesses?

Notez également la clause .on('query'. Je l'utilise lors du débogage. Cela garantit que le code SQL généré correspond à ce que j'attendais et indique que la requête est en cours d'exécution.

Je laisse la clause .on('query-error' pour obtenir de bons conseils d'erreur d'exécution, mais je me connecte en réalité via un mécanisme basé sur fichier.

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
source placée ici