База данных (Database)

Database — важный компонент источников данных типа базы данных (DataSource). Каждый источник данных типа базы данных имеет соответствующий экземпляр Database, доступный через dataSource.db. Экземпляр базы данных основного источника данных также предоставляет удобный псевдоним app.db. Знакомство с общими методами db имеет основополагающее значение для написания серверных плагинов.

Компоненты базы данных

Типичный Database состоит из следующих частей:

  • Collections: определяет структуру таблицы данных.
  • Model: соответствует моделям ORM (обычно управляемым Sequelize).
  • Repository: уровень репозитория, который инкапсулирует логику доступа к данным и обеспечивает методы работы более высокого уровня.
  • FieldType: типы полей.
  • FilterOperator: операторы, используемые для фильтрации.
  • Event: события жизненного цикла и события базы данных.

Этапы использования в плагинах

Что подходит для этапа перед загрузкой beforeLoad

На этом этапе операции с базой данных запрещены. Он подходит для статической регистрации классов и подписки на события.

  • db.registerFieldTypes() — регистрация пользовательских типов полей.
  • db.registerModels() — Регистрация пользовательских классов моделей.
  • db.registerRepositories() — Регистрация пользовательских классов репозитория.
  • db.registerOperators() — Регистрация операторов пользовательских фильтров.
  • db.on() — Прослушивание событий, связанных с базой данных.

Что подходит для этапа загрузки load

На этом этапе уже загружены все определения классов и события, поэтому при загрузке таблиц данных не будет отсутствующих зависимостей.

  • db.defineCollection() — Определить новые таблицы данных.
  • db.extendCollection() — Расширить существующие конфигурации таблиц данных.

Для определения встроенных таблиц плагина рекомендуется размещать их в каталоге ./src/server/collections. См. Коллекции.

Операции с данными

Database предоставляет два основных способа доступа к данным и работы с ними:

Операции через репозиторий

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

Уровень репозитория обычно используется для инкапсуляции бизнес-логики, такой как разбиение на страницы, фильтрация, проверки разрешений и т. д.

Операции через модель

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

Уровень модели напрямую соответствует объектам ORM и подходит для операций с базой данных нижнего уровня.

На каких этапах разрешены операции с базой данных?

Жизненный цикл плагина

ЭтапРазрешены операции с базой данных
staticImportНет
afterAddНет
beforeLoadНет
loadНет
installДа
beforeEnableДа
afterEnableДа
beforeDisableДа
afterDisableДа
removeДа
handleSyncMessageДа

События приложения

ЭтапРазрешены операции с базой данных
beforeLoadНет
afterLoadНет
beforeStartДа
afterStartДа
beforeInstallНет
afterInstallДа
beforeStopДа
afterStopНет
beforeDestroyДа
afterDestroyНет
beforeLoadPluginНет
afterLoadPluginНет
beforeEnablePluginДа
afterEnablePluginДа
beforeDisablePluginДа
afterDisablePluginДа
afterUpgradeДа

События базы данных и хуки

ЭтапРазрешены операции с базой данных
beforeSyncНет
afterSyncДа
beforeValidateДа
afterValidateДа
beforeCreateДа
afterCreateДа
beforeUpdateДа
afterUpdateДа
beforeSaveДа
afterSaveДа
beforeDestroyДа
afterDestroyДа
afterCreateWithAssociationsДа
afterUpdateWithAssociationsДа
afterSaveWithAssociationsДа
beforeDefineCollectionНет
afterDefineCollectionНет
beforeRemoveCollectionНет
afterRemoveCollectionНет