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
D\'autres questions