1 Knex, Postgres và STRING_ARRAY: nhận các kết quả khác nhau

câu hỏi được tạo ra tại Wed, May 8, 2019 12:00 AM

Tôi đã kiểm tra một truy vấn tại đây bằng cách sử dụng STRING_ARRAY: http://sqlfiddle.com/# ! 17/952405/1

Cũng tại đây:

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

Các công việc trên như mong đợi. Tuy nhiên, khi tôi chạy nó trên máy chủ Node.JS /Express bằng Knex, tôi nhận được phản hồi kỳ lạ.

Đây là mã:

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

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

Tôi mong đợi đầu ra tương tự như từ sqlfiddle ở trên. Tuy nhiên, tôi đã lấy lại được điều này (NB, dữ liệu dự kiến ​​sẽ là giá trị cho khóa 'hội thảo':

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

}

Tôi đã tìm kiếm xung quanh một chút và thấy rằng đây là định dạng mà các truy vấn INSERT thường trả về cho các postgres nút, tuy nhiên tôi vẫn chưa tìm thấy giải pháp. Có ý tưởng nào không?

    
0
1 Câu trả lời                              1                         

Có vẻ như chức năng của bạn findParentWorkshops đang trả về (một phần) định nghĩa truy vấn, thay vì kết quả truy vấn. Vì vậy, nó không thực sự thực thi.

Dưới đây tôi đã gói gọn trong một lời hứa và bao gồm các câu lệnh return và nó thực thi tạo ra kết quả. Tôi đang sử dụng nút v6, có lẽ phiên bản mới hơn của bạn hoạt động hơi khác một chút hoặc bạn đang sử dụng bluebird cho lời hứa của mình?

Ngoài ra, lưu ý mệnh đề .on('query'. Tôi sử dụng điều này trong khi gỡ lỗi. Nó đảm bảo SQL được tạo là những gì tôi mong đợi và nó cho thấy rằng truy vấn đang thực sự thực thi.

Tôi để lại mệnh đề .on('query-error' trong các gợi ý lỗi thời gian chạy tốt, nhưng thực tế đăng nhập thông qua cơ chế dựa trên tệp.

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
nguồn đặt đây