1 Soalan: Knex, Postgres, dan STRING_ARRAY: mendapatkan hasil yang berbeza

soalan dicipta di Wed, May 8, 2019 12:00 AM

Saya telah menguji pertanyaan di sini menggunakan STRING_ARRAY: http://sqlfiddle.com/# ! 17/952405/1

Juga di sini:

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

Kerja-kerja di atas seperti yang dijangkakan. Walau bagaimanapun, apabila saya menjalankannya pada pelayan Node.JS /Express saya menggunakan Knex, saya mendapat sambutan yang ganjil.

Berikut ialah 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);

Saya menjangkakan output yang sama dari sqlfiddle di atas. Walau bagaimanapun, saya mendapat balik ini (NB, data yang dijangkakan seharusnya nilai untuk 'bengkel' utama:

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

}

Saya telah mencari sekeliling sedikit, dan mendapati bahawa ini adalah format yang pertanyaan INSERT biasanya kembali untuk nod-postgres, namun saya masih belum mencari penyelesaian. Apa-apa idea?

    
0
1 Jawapan                              1                         

Nampaknya fungsi anda findParentWorkshops adalah kembali (sebahagian daripada) definisi pertanyaan, bukannya hasil pertanyaan. Jadi ia tidak sebenarnya melaksanakan.

Di bawah saya secara jelas membungkusnya dengan janji, dan memasukkan pernyataan return, dan ia melaksanakan menghasilkan keputusan. Saya menggunakan nod v6, mungkin versi yang lebih baru anda beroperasi sedikit berbeza, atau anda menggunakan bluebird untuk janji-janji anda?

Juga, perhatikan klausa .on('query'. Saya menggunakan ini semasa debugging. Ia memastikan SQL dijana adalah apa yang saya harapkan, dan ia menunjukkan bahawa pertanyaan itu sebenarnya melaksanakan.

Saya meninggalkan klausa .on('query-error' untuk petunjuk ralat runtime yang baik, tetapi sebenarnya log melalui mekanisme berasaskan fail.

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
sumber diletakkan di sini