Database

Database là thành phần cốt lõi của nguồn dữ liệu kiểu database (DataSource). Mỗi nguồn dữ liệu kiểu database đều có một instance Database tương ứng, có thể truy cập qua dataSource.db. Instance database của nguồn dữ liệu chính còn có alias tiện lợi là app.db. Làm quen với các phương thức thường dùng của db là nền tảng để viết Plugin server.

Các thành phần của Database

Một Database điển hình bao gồm các phần sau:

  • Collection: Định nghĩa cấu trúc bảng dữ liệu.
  • Model: Tương ứng với model của ORM (thường được Sequelize quản lý).
  • Repository: Tầng repository đóng gói logic truy cập dữ liệu, cung cấp các phương thức thao tác cấp cao hơn.
  • FieldType: Kiểu Field.
  • FilterOperator: Toán tử dùng cho filter.
  • Event: Sự kiện vòng đời và sự kiện database.

Thời điểm sử dụng trong Plugin

Việc nên làm trong giai đoạn beforeLoad

Giai đoạn này chưa thể thao tác database, phù hợp để đăng ký lớp tĩnh hoặc lắng nghe event.

  • db.registerFieldTypes() — Đăng ký kiểu Field tùy chỉnh
  • db.registerModels() — Đăng ký lớp Model tùy chỉnh
  • db.registerRepositories() — Đăng ký lớp Repository tùy chỉnh
  • db.registerOperators() — Đăng ký toán tử filter tùy chỉnh
  • db.on() — Lắng nghe các sự kiện liên quan đến database

Việc nên làm trong giai đoạn load

Giai đoạn này tất cả các định nghĩa lớp và sự kiện đầu vào đã được load xong, lúc này load bảng dữ liệu sẽ không bị thiếu hoặc sót.

  • db.defineCollection() — Định nghĩa bảng dữ liệu mới
  • db.extendCollection() — Mở rộng cấu hình bảng dữ liệu hiện có

Tuy nhiên nếu định nghĩa bảng tích hợp sẵn của Plugin, khuyến khích đặt trong thư mục ./src/server/collections hơn, xem chi tiết tại Collections.

Thao tác dữ liệu

Database cung cấp hai cách chính để truy cập và thao tác dữ liệu:

Thao tác qua Repository

const repo = db.getRepository('users');
const user = await repo.findOne({ filter: { id: 1 } });

Tầng Repository thường dùng để đóng gói logic nghiệp vụ như phân trang, filter, kiểm tra quyền, v.v.

Thao tác qua Model

const UserModel = db.getModel('users');
const user = await UserModel.findByPk(1);

Tầng Model trực tiếp tương ứng với entity ORM, phù hợp để thực hiện các thao tác database ở mức thấp hơn.

Các giai đoạn nào có thể thao tác database?

Vòng đời Plugin

Giai đoạnCó thể thao tác database
staticImportNo
afterAddNo
beforeLoadNo
loadNo
installYes
beforeEnableYes
afterEnableYes
beforeDisableYes
afterDisableYes
removeYes
handleSyncMessageYes

Sự kiện App

Giai đoạnCó thể thao tác database
beforeLoadNo
afterLoadNo
beforeStartYes
afterStartYes
beforeInstallNo
afterInstallYes
beforeStopYes
afterStopNo
beforeDestroyYes
afterDestroyNo
beforeLoadPluginNo
afterLoadPluginNo
beforeEnablePluginYes
afterEnablePluginYes
beforeDisablePluginYes
afterDisablePluginYes
afterUpgradeYes

Sự kiện/Hook Database

Giai đoạnCó thể thao tác database
beforeSyncNo
afterSyncYes
beforeValidateYes
afterValidateYes
beforeCreateYes
afterCreateYes
beforeUpdateYes
afterUpdateYes
beforeSaveYes
afterSaveYes
beforeDestroyYes
afterDestroyYes
afterCreateWithAssociationsYes
afterUpdateWithAssociationsYes
afterSaveWithAssociationsYes
beforeDefineCollectionNo
afterDefineCollectionNo
beforeRemoveCollectionNo
afterRemoveCollectionNo

Liên kết liên quan

  • Collections — Định nghĩa hoặc mở rộng cấu trúc bảng dữ liệu bằng code
  • DataSourceManager — Quản lý nhiều nguồn dữ liệu và instance database của chúng
  • Context (Ngữ cảnh request) — Lấy instance db trong request
  • Plugin — Vòng đời lớp Plugin, các phương thức thành viên và đối tượng app
  • Event — Lắng nghe và xử lý sự kiện cấp ứng dụng và database