SQLResource
Resource thực thi truy vấn dựa trên cấu hình SQL đã lưu hoặc SQL động, nguồn dữ liệu là các API như flowSql:run / flowSql:runById. Phù hợp với các kịch bản như báo cáo, thống kê, list SQL tùy chỉnh. Khác với MultiRecordResource, SQLResource không phụ thuộc vào collection, thực thi truy vấn SQL trực tiếp, hỗ trợ phân trang, bind tham số, biến template ({{ctx.xxx}}) và điều khiển kiểu kết quả.
Quan hệ kế thừa: FlowResource → APIResource → BaseRecordResource → SQLResource.
Cách tạo: ctx.makeResource('SQLResource') hoặc ctx.initResource('SQLResource'). Khi thực thi theo cấu hình đã lưu cần setFilterByTk(uid) (uid của template SQL); khi debug có thể dùng setDebug(true) + setSQL(sql) để thực thi SQL trực tiếp; trong RunJS, ctx.api được inject bởi môi trường runtime.
Kịch bản áp dụng
Định dạng dữ liệu
getData()trả về định dạng khác nhau dựa trênsetSQLType():selectRows(mặc định): array, kết quả nhiều hàngselectRow: object đơnselectVar: giá trị scalar (như COUNT, SUM)
getMeta()trả về metadata phân trang, v.v.:page,pageSize,count,totalPage, v.v.
Cấu hình SQL và chế độ thực thi
Tham số và ngữ cảnh
Phân trang
Trong SQL có thể sử dụng {{ctx.limit}}, {{ctx.offset}} để tham chiếu tham số phân trang, SQLResource sẽ inject limit, offset vào ngữ cảnh.
Lấy dữ liệu và sự kiện
Ví dụ
Thực thi theo template đã lưu (runById)
Chế độ debug: thực thi SQL trực tiếp (runBySQL)
Phân trang và lật trang
Kiểu kết quả
Sử dụng biến template
Lắng nghe sự kiện refresh
Lưu ý
- runById cần lưu template trước: uid của
setFilterByTk(uid)phải là ID template SQL đã lưu trên admin, có thể lưu quactx.sql.save({ uid, sql }). - Chế độ debug cần quyền: Khi
setDebug(true)đi quaflowSql:run, cần role hiện tại có quyền cấu hình SQL;runByIdchỉ cần đăng nhập là được. - Debounce refresh: Nhiều lần gọi
refresh()trong cùng event loop chỉ thực thi lần cuối, tránh request trùng lặp. - Bind tham số chống injection: Sử dụng
setBind()kèm placeholder:name/?, tránh nối chuỗi gây SQL injection.
Liên quan
- ctx.sql - Thực thi và quản lý SQL,
ctx.sql.runByIdphù hợp với truy vấn đơn giản một lần - ctx.resource - Instance resource trong ngữ cảnh hiện tại
- ctx.initResource() - Khởi tạo và bind vào ctx.resource
- ctx.makeResource() - Tạo instance resource mới, không bind
- APIResource - Resource API thông dụng
- MultiRecordResource - Hướng đến collection/list

