Create Many
Migration
- Cần tạo create many cho bảng khác cần đổi tên function, schema và public.
Ví dụ:
- Tên function
public.create_many_school_names=>lms.create_many_chapters - Các schema liên quan
public.school_name=>lms.chapter
'use strict';
/** @type {import('sequelize-cli').Migration} */
module.exports = {
async up(queryInterface, Sequelize) {
// Chạy lệnh tạo function dưới Database
await queryInterface.sequelize.query(`
CREATE OR REPLACE FUNCTION public.create_many_school_names(payload jsonb)
-- Trả về set các bản ghi chuẩn của bảng school_name
RETURNS SETOF public.school_name AS $$
DECLARE
insert_cols text;
sql_query text;
BEGIN
-- 1. Validation cơ bản
IF jsonb_typeof(payload) != 'array' OR jsonb_array_length(payload) = 0 THEN
RAISE EXCEPTION 'Lỗi định dạng: Payload phải là một mảng JSON không rỗng.';
END IF;
-- 2. Tự động lấy danh sách các cột cần insert từ object ĐẦU TIÊN
SELECT string_agg(format('%1$I', key), ', ')
INTO insert_cols
FROM jsonb_object_keys(payload->0) AS key;
IF insert_cols IS NULL OR insert_cols = '' THEN
RAISE EXCEPTION 'Lỗi Payload: Không có trường dữ liệu nào để thêm mới.';
END IF;
-- 3. Build câu lệnh INSERT (Fix cứng tên bảng school_name)
-- RETURNING * sẽ lấy toàn bộ dữ liệu vừa gen ra (bao gồm id tự tăng)
sql_query := format(
'INSERT INTO public.school_name (%1$s)
SELECT %1$s
FROM jsonb_populate_recordset(null::public.school_name, $1)
RETURNING *',
insert_cols
);
-- 4. Thực thi và trả thẳng kết quả về cho GraphQL
RETURN QUERY EXECUTE sql_query USING payload;
EXCEPTION
WHEN OTHERS THEN
RAISE EXCEPTION 'Lỗi thêm mới bảng school_name: % (Mã lỗi: %)', SQLERRM, SQLSTATE;
END;
$$ LANGUAGE plpgsql VOLATILE STRICT;
`);
},
async down(queryInterface, Sequelize) {
// Lệnh này giúp bạn có thể chạy db:migrate:undo dễ dàng nếu cần xóa/rollback hàm này
await queryInterface.sequelize.query(`
DROP FUNCTION IF EXISTS public.create_many_school_names(jsonb);
`);
}
};
Query
- Reload lại Graphile
- Vào groupSchema đã tạo function
- Tìm query many tương tự ví dụ
coreSharedPublicCreateManySchoolNames
mutation MyMutation2($payload: JSON!) {
coreSharedPublicCreateManySchoolNames(input: {payload: $payload}) {
result {
rowId
}
}
}
Variable
- Variables bao gồm object có key "payload" và value là "array"
{
"payload":[
{"school_id": 3, "name": "Bài 3: Thanh âm của gió v2", "updated_at": "now"},
{"school_id": 3, "name": "Bài 4: Sấm sét của mữa", "updated_at": "now"}
]
}