SQLResource
Resource yang menjalankan query berdasarkan konfigurasi SQL yang sudah disimpan atau SQL dinamis, sumber data adalah API seperti flowSql:run / flowSql:runById. Cocok untuk skenario seperti laporan, statistik, list SQL kustom, dll. Berbeda dengan MultiRecordResource, SQLResource tidak bergantung pada data table, langsung mengeksekusi query SQL, mendukung pagination, parameter binding, variabel template ({{ctx.xxx}}), dan kontrol tipe hasil.
Hubungan Inheritance: FlowResource → APIResource → BaseRecordResource → SQLResource.
Cara Pembuatan: ctx.makeResource('SQLResource') atau ctx.initResource('SQLResource'). Saat dijalankan berdasarkan konfigurasi yang sudah disimpan perlu setFilterByTk(uid) (uid template SQL); saat debugging dapat menggunakan setDebug(true) + setSQL(sql) untuk langsung mengeksekusi SQL; di RunJS ctx.api disuntikkan oleh runtime environment.
Skenario Penggunaan
Format Data
getData()mengembalikan format berbeda berdasarkansetSQLType():selectRows(default): array, hasil multiple rowselectRow: objek tunggalselectVar: nilai scalar (seperti COUNT, SUM)
getMeta()mengembalikan informasi meta seperti pagination:page,pageSize,count,totalPage, dll.
Konfigurasi SQL dan Mode Eksekusi
Parameter dan Konteks
Pagination
Di SQL dapat menggunakan {{ctx.limit}}, {{ctx.offset}} untuk mereferensikan parameter pagination, SQLResource akan menyuntikkan limit, offset di konteks.
Pengambilan Data dan Event
Contoh
Eksekusi Berdasarkan Template yang Sudah Disimpan (runById)
Mode Debug: Langsung Mengeksekusi SQL (runBySQL)
Pagination dan Pindah Halaman
Tipe Hasil
Menggunakan Variabel Template
Memantau Event refresh
Hal yang Perlu Diperhatikan
- runById perlu menyimpan template terlebih dahulu: uid
setFilterByTk(uid)harus merupakan ID template SQL yang sudah disimpan di management, dapat disimpan melaluictx.sql.save({ uid, sql }). - Mode debug perlu izin: saat
setDebug(true)menjalankanflowSql:run, perlu role saat ini memiliki izin konfigurasi SQL;runByIdhanya perlu login. - Debounce refresh: dalam event loop yang sama beberapa pemanggilan
refresh()hanya akan mengeksekusi yang terakhir, untuk menghindari request berulang. - Parameter binding mencegah injection: gunakan
setBind()dengan placeholder:name/?, untuk menghindari SQL injection akibat penggabungan string.
Terkait
- ctx.sql - Eksekusi dan manajemen SQL,
ctx.sql.runByIdcocok untuk query sekali pakai sederhana - ctx.resource - Instance resource dalam konteks saat ini
- ctx.initResource() - Inisialisasi dan mengikat ke ctx.resource
- ctx.makeResource() - Membuat instance resource baru, tidak mengikat
- APIResource - API resource umum
- MultiRecordResource - Berorientasi data table/list

