AppMaster cung cấp khả năng mở rộng để làm việc với cơ sở dữ liệu. Ví dụ: bằng cách sử dụng khối Tìm kiếm, bạn có thể tìm thấy dữ liệu cần thiết, đính kèm các bảng liên quan vào dữ liệu đó, sắp xếp theo đúng thứ tự, v.v. Tuy nhiên, trong một số trường hợp, điều này có thể là không đủ và sau đó khối SQL Exec sẽ xuất hiện. cuộc giải cứu. Nó cho phép bạn chạy bất kỳ truy vấn cơ sở dữ liệu nào bằng toàn bộ sức mạnh của SQL.
Hãy xem xét hoạt động của khối bằng ví dụ về cơ sở dữ liệu chứa danh mục sách.
Hãy làm một chút công việc chuẩn bị. Cần phải tạo ra một quy trình kinh doanh, ở dạng đơn giản nhất, cho phép gửi yêu cầu cũng như nhận kết quả của chúng.
Bạn cũng sẽ cần tạo một điểm cuối cho phép bạn truy cập vào quy trình công việc này.
Ở giai đoạn đầu, điều này là đủ. Bạn có thể xuất bản ứng dụng của mình và chuyển sang thử nghiệm. Để làm được điều này, sẽ rất thuận tiện khi sử dụng Swagger, tính năng này được tạo tự động khi xuất bản.
Chúng tôi sử dụng một truy vấn đơn giản để yêu cầu tất cả sách từ cơ sở dữ liệu.
CHỌN * TỪ public.book
Xin lưu ý rằng bản thân bảng (giống như tất cả các bảng khác được tạo trong trình soạn thảo cơ sở dữ liệu) có tiền tố biểu thị lược đồ - công khai.
Bạn có thể xác minh rằng yêu cầu đã được hoàn thành thành công và đã nhận được kết quả.
Nhưng vấn đề là rất khó để nhận ra câu trả lời ở dạng này. Một giải pháp khả thi là sửa đổi yêu cầu một chút và chỉ để lại những trường cần thiết trong đó—ví dụ: tên sách và số trang. Ngoài ra, sẽ hợp lý nếu đặt giới hạn, không yêu cầu tất cả sách từ cơ sở dữ liệu mà chỉ giới hạn ở mức mười cuốn.
CHỌN tên, trang TỪ public.book GIỚI HẠN 10
Tốt hơn nhiều, nhưng vẫn không phù hợp để sử dụng thực tế. Xét cho cùng, trong một quy trình kinh doanh, bạn không chỉ cần nhận được yêu cầu mà còn phải làm điều gì đó với kết quả của nó. Đối với điều này, việc có kết quả ở dạng văn bản là chưa đủ; bạn cần biến nó thành một mô hình phù hợp để sử dụng tiếp.
Để làm điều này, hãy quay lại quy trình kinh doanh và tinh chỉnh nó một chút. Trong khối kết thúc, chúng ta sẽ thêm một biến mới - một mảng các mô hình sách.
Bạn cũng sẽ cần một khối để chuyển đổi JSON nhận được do yêu cầu thành mô hình. Giải tuần tự hóa JSON thành mô hình.
Hãy lặp lại yêu cầu trước đó và đảm bảo rằng kết quả đã trở nên phù hợp hơn nhiều, cho cả nhận thức trực quan và sử dụng tiếp theo trong BP.
Bây giờ, chúng ta có thể chuyển sang logic phức tạp hơn. Hãy tạo một quy trình kinh doanh:
- Nhận tiêu đề của cuốn sách làm đầu vào.
- Xác định danh mục (thể loại) nó thuộc về.
- Kết quả trả về 3 cuốn sách ngẫu nhiên từ cùng một danh mục (trong trường hợp này, cuốn sách được yêu cầu không nằm trong số đó)
Để thực hiện điều này, chúng tôi sẽ tạo một quy trình công việc mới kết hợp tìm kiếm bằng cách sử dụng các khối tiêu chuẩn và sử dụng truy vấn SQL.
Khối đầu tiên là tìm một cuốn sách theo tên của nó, đồng thời xác định nó thuộc về danh mục nào. Để thực hiện việc này, chúng tôi sử dụng khối tìm kiếm với các tham số sau:
- _Với = Danh mục - ngoài chính cuốn sách, kết quả truy vấn còn yêu cầu thông tin từ bảng danh mục liên quan.
- _Giới hạn = 1 - chỉ cần tìm một cuốn sách.
- _Ilike = Sai - tên phải khớp chính xác với tên được yêu cầu.
- Tên - chỉ mục tên sách, được truyền từ khối Bắt đầu.
Sử dụng khối Phần tử mảng có chỉ số 0, chúng ta lấy cuốn sách đầu tiên (và duy nhất) từ kết quả.
Một cuốn sách có thể thuộc nhiều danh mục khác nhau cùng một lúc và trong trường hợp này, bất kỳ danh mục nào trong số đó đều phù hợp với chúng ta. Nó có thể được chọn ngẫu nhiên bằng cách sử dụng khối phần tử Ngẫu nhiên
Sau này, chúng ta có tất cả dữ liệu cần thiết và tất cả những gì còn lại là tự tạo yêu cầu, có thể trông như thế này:
CHỌN * TỪ public.book WHERE id IN (CHỌN rel1_id TỪ public.book_categorys_category_books_pivot WHERE book_categorys_category_books_pivot.rel2_id = X) VÀ id <> Y ĐẶT HÀNG THEO ngẫu nhiên() GIỚI HẠN 3
Trong đó X là id của danh mục sách và Y là id của chính cuốn sách đó.
Xin lưu ý rằng truy vấn này bao gồm một truy vấn phụ. Đầu tiên, từ bảng book_categorys_category_books_pivot (nó được sử dụng để lưu trữ thông tin về mối quan hệ giữa hai bảng), tất cả số nhận dạng sách tương ứng với danh mục đã chọn sẽ được tìm thấy. Sau đó, một truy vấn được thực thi để tìm ngẫu nhiên 3 cuốn sách phù hợp với phạm vi đã chỉ định, ngoại trừ ID sách có tiêu đề ban đầu được chuyển cho quy trình kinh doanh.
Để nghiên cứu chi tiết hơn về cấu trúc cơ sở dữ liệu dự án, bạn có thể sử dụng nút Open DB trong cài đặt Kế hoạch triển khai.
Nó sẽ cho phép bạn mở cơ sở dữ liệu trong trình chỉnh sửa và có quyền truy cập trực tiếp vào việc xem và chỉnh sửa dữ liệu. Tuy nhiên, bạn nên cẩn thận và tính đến thực tế là việc thay đổi cấu trúc dữ liệu trong trình chỉnh sửa sẽ khiến dự án không thể xuất bản thêm.
Hãy quay trở lại việc tạo ra một quy trình kinh doanh. Cần phải hoàn thành việc biên soạn yêu cầu và để thực hiện việc này, hãy chuyển đổi ID sách và danh mục từ số nguyên sang chuỗi, đồng thời tập hợp yêu cầu cuối cùng bằng cách sử dụng khối Concat Strings (Nhiều).
Bước cuối cùng là thực hiện truy vấn, chuyển đổi kết quả thành mô hình và gửi nó đến khối Kết thúc dưới dạng kết quả truy vấn.
Bạn có thể lưu các thay đổi của mình, tạo điểm cuối, xuất bản dự án của mình và xác minh rằng yêu cầu hoạt động chính xác. Trong trường hợp này, một khối SQL Exec với truy vấn phức hợp phức tạp đã được sử dụng để thay thế nhiều khối khác và đơn giản hóa cấu trúc của quy trình nghiệp vụ.
Việc sử dụng khối SQL Exec không giới hạn ở việc truy xuất dữ liệu và có thể được sử dụng trong nhiều tình huống khác nhau. Chúng ta hãy xem xét kỹ hơn một vài lựa chọn khác.
- Đếm số lượng bình luận cho một cuốn sách có id=X
CHỌN ĐẾM(id) TỪ public.comment WHERE book_id = X - Tính xếp hạng trung bình của một cuốn sách, có tính đến tất cả các xếp hạng được đưa ra trong phần nhận xét:
CHỌN AVG (tỷ lệ) TỪ public.comment WHERE book_id = X - Xóa tất cả các bình luận được viết trước năm 2023 (ví dụ: có thể được sử dụng để xóa nhật ký nhanh chóng).
XÓA * TỪ public.comment Ở ĐÂU đã tạo_at < '2023-01-01'
Tóm lại, điều đáng lưu ý là để cải thiện tính bảo mật, một bộ lọc đã được thêm vào khối SQL Exec dành cho các hoạt động nguy hiểm có thể dẫn đến thay đổi lược đồ.
CREATE/ALTER/DROP/TRUNCATE cho TABLE|COLUMN|INDEX|CONSTRAINT|SEQUENCE|SCHEMA|DATABASE bị bộ lọc vô hiệu hóa nếu ứng dụng được lưu trữ trên máy chủ AppMaster. Khi lưu trữ tại chỗ - theo mặc định, mọi yêu cầu đều có sẵn mà không bị hạn chế.