AppMaster menawarkan kemampuan ekstensif untuk bekerja dengan database. Misalnya, menggunakan blok Pencarian, Anda dapat menemukan data yang diperlukan, melampirkan tabel terkait, mengurutkannya dalam urutan yang benar, dll. Namun, dalam situasi tertentu, ini mungkin tidak cukup, dan kemudian blok SQL Exec muncul. Penyelamatan. Ini memungkinkan Anda menjalankan kueri database apa pun menggunakan kekuatan penuh SQL.
Mari kita perhatikan pengoperasian blok menggunakan contoh database yang berisi katalog buku.
Mari kita lakukan sedikit pekerjaan persiapan. Penting untuk menciptakan proses bisnis yang, dalam bentuknya yang paling sederhana, memungkinkan pengiriman permintaan, serta menerima hasilnya.
Anda juga perlu membuat titik akhir yang memungkinkan Anda mengakses proses bisnis ini.
Pada tahap awal, ini sudah cukup. Anda dapat memublikasikan aplikasi Anda dan melanjutkan ke pengujian. Untuk ini, sangat mudah menggunakan Swagger, yang dibuat secara otomatis saat diterbitkan.
Kami menggunakan kueri sederhana yang seharusnya meminta semua buku dari database.
PILIH * DARI buku publik
Harap dicatat bahwa tabel itu sendiri (seperti semua tabel lain yang dibuat di editor database) memiliki awalan yang menunjukkan skema - publik.
Anda dapat memverifikasi bahwa permintaan berhasil diselesaikan dan hasilnya telah diterima.
Namun masalahnya adalah sangat sulit untuk memahami jawaban dalam bentuk ini. Solusi yang mungkin dilakukan adalah dengan mengubah sedikit permintaan dan hanya menyisakan kolom yang diperlukan saja—misalnya, judul buku dan jumlah halaman. Selain itu, masuk akal untuk menetapkan batasan, tidak meminta semua buku dari database, tetapi membatasi diri Anda hingga sepuluh.
PILIH nama, halaman DARI public.book LIMIT 10
Jauh lebih baik, tetapi masih belum cocok untuk penggunaan nyata. Lagi pula, dalam proses bisnis, Anda tidak hanya perlu menerima permintaan tetapi juga melakukan sesuatu dengan hasilnya. Untuk ini, tidak cukup hanya mendapatkan hasil dalam bentuk teks; Anda perlu mengubahnya menjadi model yang cocok untuk digunakan lebih lanjut.
Untuk melakukan ini, mari kembali ke proses bisnis dan perbaiki sedikit. Di blok akhir, kita akan menambahkan variabel baru - array model buku.
Anda juga memerlukan blok yang akan mengubah JSON yang diterima sebagai hasil permintaan menjadi model. Deserialisasi JSON Ke Model.
Mari kita ulangi permintaan sebelumnya dan pastikan hasilnya lebih sesuai, baik untuk persepsi visual maupun untuk penggunaan lebih lanjut di BP.
Sekarang, kita dapat beralih ke logika yang lebih kompleks. Mari kita buat proses bisnis yang:
- Menerima judul buku sebagai masukan.
- Menentukan kategori (genre) mana yang dimilikinya.
- Mengembalikan 3 buku acak dari kategori yang sama sebagai hasilnya (dalam hal ini, buku dari permintaan tidak boleh ada di antara buku tersebut)
Untuk melakukan ini, kami akan membuat proses bisnis baru yang menggabungkan pencarian menggunakan blok standar dan penggunaan kueri SQL.
Blok pertama adalah menemukan buku berdasarkan judulnya, dan juga menentukan kategorinya. Untuk melakukan ini, kami menggunakan blok pencarian dengan parameter berikut:
- _Dengan = Kategori - selain buku itu sendiri, hasil kueri memerlukan informasi dari tabel kategori terkait.
- _Limit = 1 - hanya perlu menemukan satu buku.
- _Ilike = False - nama harus sama persis dengan yang diminta.
- Nama - indeks judul buku, diteruskan dari blok Start.
Menggunakan blok Elemen Array dengan indeks 0, kita mengambil buku pertama (dan satu-satunya) dari hasilnya.
Sebuah buku dapat dimasukkan ke dalam beberapa kategori berbeda secara bersamaan, dan dalam hal ini, salah satu kategori tersebut cocok untuk kita. Itu dapat dipilih secara acak menggunakan blok elemen Acak
Setelah ini, kita memiliki semua data yang diperlukan, dan yang tersisa hanyalah membuat permintaan itu sendiri, yang mungkin terlihat seperti ini:
PILIH * DARI public.book WHERE id IN (PILIH rel1_id DARI public.book_categorys_category_books_pivot WHERE book_categorys_category_books_pivot.rel2_id = X) DAN id <> Y ORDER BY random() LIMIT 3
Dimana X adalah id kategori buku, dan Y adalah id dari buku itu sendiri.
Harap perhatikan bahwa kueri ini menyertakan subkueri. Pertama, dari tabel book_categorys_category_books_pivot (digunakan untuk menyimpan informasi tentang hubungan antara dua tabel), semua pengidentifikasi buku yang sesuai dengan kategori yang dipilih ditemukan. Setelah ini, kueri dijalankan yang menemukan 3 buku acak yang cocok dengan rentang yang ditentukan, tidak termasuk ID buku, yang judulnya awalnya diteruskan ke proses bisnis.
Untuk studi lebih rinci tentang struktur database proyek, Anda dapat menggunakan tombol Open DB di pengaturan Deploy Plans.
Ini akan memungkinkan Anda untuk membuka database di editor dan mendapatkan akses langsung untuk melihat dan mengedit data. Namun, Anda harus berhati-hati dan mempertimbangkan fakta bahwa mengubah struktur data itu sendiri di editor akan membuat proyek tidak dapat dipublikasikan lebih lanjut.
Mari kembali membuat proses bisnis. Kompilasi permintaan perlu diselesaikan dan untuk melakukan ini, ubah ID buku dan kategori dari integer menjadi string dan juga kumpulkan permintaan akhir menggunakan blok Concat Strings (Multiple).
Langkah terakhir adalah mengeksekusi query, mengubah hasilnya menjadi model, dan mengirimkannya ke blok End sebagai hasil query.
Anda dapat menyimpan perubahan, membuat titik akhir, mempublikasikan proyek, dan memverifikasi bahwa permintaan berfungsi dengan benar. Dalam hal ini, satu blok SQL Exec dengan kueri gabungan yang kompleks digunakan untuk menggantikan banyak blok lainnya dan menyederhanakan struktur proses bisnis.
Penggunaan blok SQL Exec tidak terbatas pada pengambilan data dan dapat digunakan dalam berbagai skenario. Mari kita lihat lebih dekat beberapa opsi lainnya.
- Menghitung jumlah komentar untuk buku dengan id=X
PILIH JUMLAH(id) DARI publik.komentar WHERE book_id = X - Perhitungan rating rata-rata sebuah buku, dengan mempertimbangkan semua rating yang diberikan di komentar:
PILIH AVG(rate) DARI public.comment WHERE book_id = X - Menghapus semua komentar yang ditulis sebelum tahun 2023 (dapat digunakan, misalnya, untuk menghapus log dengan cepat).
HAPUS * DARI public.comment WHERE dibuat_at < '01-01-2023'
Sebagai kesimpulan, perlu dicatat bahwa untuk meningkatkan keamanan, filter telah ditambahkan ke blok SQL Exec untuk operasi berbahaya yang dapat menyebabkan perubahan skema.
CREATE/ALTER/DROP/TRUNCATE untuk TABLE|COLUMN|INDEX|CONSTRAINT|SEQUENCE|SCHEMA|DATABASE dinonaktifkan oleh filter jika aplikasi dihosting di server AppMaster. Saat menghosting di lokasi - secara default, permintaan apa pun tersedia tanpa batasan.