Database - База данных
Обзор
Database — это инструмент взаимодействия с базой данных, предоставляемый NocoBase, предлагающий удобные возможности взаимодействия с базой данных для приложений без кода и с низким кодом. В настоящее время поддерживаются следующие базы данных:
- SQLite 3.8.8+
- MySQL 8.0.17+
- PostgreSQL 10.0+
Подключение к базе данных
В конструкторе Database можно настроить подключение к базе данных, передав параметр options.
Подробные параметры конфигурации см. в разделе Конструктор.
Определение модели данных
Database определяет структуру базы данных через Collection. Объект Collection представляет таблицу в базе данных.
После определения структуры базы данных вы можете использовать метод sync() для синхронизации структуры базы данных.
Более подробную информацию об использовании Collection см. в Коллекция.
Чтение/запись данных
Database оперирует данными через Repository.
Более подробную информацию об использовании данных CRUD см. в Репозиторий.
Конструктор
Сигнатура
constructor(options: DatabaseOptions)
Создает экземпляр базы данных.
Параметры
Метод ы, связанные с миграцией
addMigration()
Добавляет один файл миграции.
Сигнатура
addMigration(options: MigrationItem)
Параметры
Пример
addMigrations()
Добавляет файлы миграции из указанного каталога.
Сигнатура
addMigrations(options: AddMigrationsOptions): void
Параметры
Пример
Служебные методы
inDialect()
Проверяет, является ли текущий тип базы данных одним из указанных типов.
Сигнатура
inDialect(dialect: string[]): boolean
Параметры
getTablePrefix()
Получает префикс имени таблицы из конфигурации.
Сигнатура
getTablePrefix(): string
Конфигурация коллекции
collection()
Определяет коллекцию. Этот вызов аналогичен методу define Sequelize, создающему структуру таблицы только в памяти. Чтобы сохранить его в базе данных, вам нужно вызвать метод sync.
Сигнатура
collection(options: CollectionOptions): Collection
Параметры
Все параметры конфигурации options соответствуют конструктору класса Collection, см. Collection.
События
'beforeDefineCollection': срабатывает перед определением коллекции.'afterDefineCollection': срабатывает после определения коллекции.
Пример
getCollection()
Получает определенную коллекцию.
Сигнатура
getCollection(name: string): Collection
Параметры
Пример
hasCollection()
Проверяет, определена ли указанная коллекция.
Сигнатура
hasCollection(name: string): boolean
Параметры
Пример
removeCollection()
Удаляет определенную коллекцию. Оно только удаляется из памяти; чтобы сохранить изменение, вам нужно вызвать метод sync.
Сигнатура
removeCollection(name: string): void
Параметры
События
'beforeRemoveCollection': срабатывает перед удалением коллекции.'afterRemoveCollection': срабатывает после удаления коллекции.
Пример
import()
Импортирует все файлы в каталоге как конфигурации коллекции в память.
Сигнатура
async import(options: { directory: string; extensions?: ImportFileExtension[] }): Promise<Map<string, Collection>>
Параметры
Пример
Коллекция, определенная в файле ./collections/books.ts, выглядит следующим образом:
Импортируйте соответствующую конфигурацию при загрузке плагина:
Регистрация и получение расширений
registerFieldTypes()
Регистрирует типы настраиваемых полей.
Сигнатура
registerFieldTypes(fieldTypes: MapOf<typeof Field>): void
Параметры
fieldTypes — это пара ключ-значение, где ключ — это имя типа поля, а значение — класс типа поля.
Пример
registerModels()
Ре гистрирует пользовательские классы модели данных.
Сигнатура
registerModels(models: MapOf<ModelStatic<any>>): void
Параметры
models — это пара ключ-значение, где ключ — это имя модели, а значение — класс модели.
Пример
registerRepositories()
Регистрирует пользовательские классы репозитория.
Сигнатура
registerRepositories(repositories: MapOf<RepositoryType>): void
Параметры
repositories — это пара ключ-значение, где ключ — это имя репозитория, а значение — класс репозитория.
Пример
registerOperators()
Регистрирует пользовательские операторы запроса данных.
Сигнатура
registerOperators(operators: MapOf<OperatorFunc>)
Параметры
operators — это пара ключ-значение, где ключ — это имя оператора, а значение — это функция, генерирующая оператор сравнения.
Пример
getModel()
Получает определенный класс модели данных. Если ранее не был зарегистрирован пользовательский класс модели, он вернет класс модели Sequelize по умолчанию. Имя по умолчанию совпадает с именем коллекции.
Сигнатура
getModel(name: string): Model
Параметры
Пример
Примечание. Класс модели, полученный из коллекции, не строго равен зарегистрированному классу модели, а наследуется от него. Поскольку свойства класса модели Sequelize изменяются во время инициализации, NocoBase автоматически обрабатывает эти отношения наследования. За исключением классового неравенства, все остальные определения можно использовать нормально.
getRepository()
Получает пользовательский класс репозитория. Если ранее не был зарегистрирован пользовательский класс репозитория, будет возвращен класс репозитория NocoBase по умолчанию. Имя по умолчанию совпадает с именем коллекции.
Классы репозитория в основном используются для операций CRUD на основе моделей данных, см. Репозиторий.
Сигнатура
getRepository(name: string): RepositorygetRepository(name: string, relationId?: string | number): Repository
Параметры
Если имя является именем ассоциации, например 'tables.relations', оно вернет связанный класс репозитория. Если указан второй параметр, репозиторий будет основан на значении внешнего ключа реляционных данных при использовании (запрос, обновление и т. д.).
Пример
Предположим, есть две коллекции: posts и authors, и коллекция Posts имеет внешний ключ, указывающий на коллекцию авторов:
События базы данных
on()
Прослушивает события базы данных.
Сигнатура
on(event: string, listener: (...args: any[]) => void | Promise<void>): void
Параметры
Имена событий по умолчанию поддерживают события модели Sequelize. Для глобальных событий прослушивайте формат <sequelize_model_global_event>, а для отдельных событий модели используйте формат <model_name>.<sequelize_model_event>.
Описания параметров и подробные примеры всех встроенных типов событий см. в разделе Встроенные события.
off()
Удаляет функцию прослушивателя событий.
Сигнатура
off(name: string, listener: Function)
Параметры
Пример
Операции с базой данных
auth()
Аутентификация подключения к базе данных. Может использоваться для проверки того, что приложение установило соединение с данными.
Сигнатура
auth(options: QueryOptions & { retry?: number } = {}): Promise<boolean>
Параметры
Пример
reconnect()
Повторно подключается к базе данных.
Пример
closed()
Проверяет, закрыто ли соединение с базой данных.
Сигнатура
closed(): boolean
close()
Закрывает соединение с базой данных. Эквивалент sequelize.close().
sync()
Синхронизирует структуру коллекции базы данных. Эквивалент sequelize.sync(), параметры см. в документации Sequelize.)
clean()
Очищает базу данных, удаляя все коллекции.
Сигнатура
clean(options: CleanOptions): Promise<void>
Параметры
Пример
Удаляет все коллекции, кроме коллекции users.
Экспорт на уровне пакета
defineCollection()
Создает содержимое конфигурации для коллекции.
Сигнатура
defineCollection(name: string, config: CollectionOptions): CollectionOptions
Параметры
Пример
Чтобы файл конфигурации коллекции был импортирован db.import():
extendCollection()
Расширяет содержимое конфигурации коллекции, уже находящейся в памяти, в основном для с одержимого файла, импортированного методом import(). Этот метод является методом верхнего уровня, экспортируемым пакетом @nocobase/database, и не вызывается через экземпляр базы данных. Также можно использовать псевдоним extend.
Сигнатура
extendCollection(collectionOptions: CollectionOptions, mergeOptions?: MergeOptions): ExtendedCollectionOptions
Параметры
Пример
Определение коллекции оригинальных книг (books.ts):
Определение расширенной коллекции книг (books.extend.ts):
Если два вышеуказанных файла импортируются при вызове import(), после повторного расширения с помощью extend(), коллекция книг будет иметь поля title и price.
Этот метод очень полезен для расширения структур коллекций, уже определенных существующими плагинами.
Встроенные события
База данных запускает следующие соответствующие события на разных этапах своего жизненного цикла. Подписка на них с помощью метода on() позволяет осуществлять конкретную обработку для удовлетворения определенных потребностей бизнеса.
'beforeSync' / 'afterSync'
Срабатывает до и после синхронизации новой конфигурации структуры коллекции (полей, индексов и т. д.) с базой данных. Обычно он срабатывает при выполнении collection.sync() (внутренний вызов) и обычно используется для обработки логики для специальных расширений полей.
Сигнатура
Тип
Пример
'beforeValidate' / 'afterValidate'
Перед созданием или обновлением данных происходит процесс проверки на основе правил, определенных в коллекции. Соответствующие события запускаются до и после проверки. Это срабатывает при вызове repository.create() или repository.update().
Сигнатура
Тип
Пример
'beforeCreate' / 'afterCreate'
Соответствующие события инициируются до и после создания записи. Это срабатывает при вызове repository.create().
Сигнатура
Тип
Пример
'beforeUpdate' / 'afterUpdate'
Соответствующие события запускаются до и после обновления записи. Это срабатывает при вызове repository.update().
Сигнатура
Тип
Пример
'beforeSave' / 'afterSave'
Соответствующие события запускаются до и после создания или обновления записи. Это срабатывает при вызове repository.create() или repository.update().
Сигнатура
Тип
Пример
'beforeDestroy' / 'afterDestroy'
Соответствующие события срабат ывают до и после удаления записи. Это срабатывает при вызове repository.destroy().
Сигнатура
Тип
Пример
'afterCreateWithAssociations'
Это событие инициируется после создания записи с данными иерархической связи. Он срабатывает при вызове repository.create().
Сигнатура
Тип
Пример
'afterUpdateWithAssociations'
Это событие инициируется после обновления записи с данными иерархической связи. Он срабатывает при вызове repository.update().
Сигнатура
Тип
Пример
'afterSaveWithAssociations'
Это событие инициируется после создания или обновления записи с данными иерархической связи. Он срабатывает при вызове repository.create() или repository.update().
Сигнатура
Тип
Пример
'beforeDefineCollection'
Срабатывает перед определением коллекции, например, при вызове db.collection().
Примечание: Это синхронное событие.
Сигнатура
Тип
Пример
'afterDefineCollection'
Запускается после определения коллекции, например, при вызове db.collection().
Примечание: Это синхронное событие.
Сигнатура
Тип
Пример
'beforeRemoveCollection' / 'afterRemoveCollection'
Срабатывает до и после удаления коллекции из памяти, например, при вызове db.removeCollection().
Примечание: Это синхронное событие.
Сигнатура
Тип
Пример

