1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/jovercao-lubejs

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
ORM.md 11 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 16.03.2025 22:42 f14ea5d

Руководство по использованию ORM

Цель Lubejs — быть элегантным и эффективным, но он может не подходить всем разработчикам. Однако в проектах, где его использование целесообразно, он будет самым элегантным и эффективным решением.

Принципы использования ORM Lubejs

Для обеспечения лучшего пользовательского опыта данная ORM система использует следующие обязательные правила:

  1. Каждая таблица должна иметь первичный ключ.
  2. Первичный ключ должен быть одним полем.
  3. Внешний ключ может ссылаться только на первичный ключ другой таблицы.

Использование undefined и null

Согласно соглашению, null соответствует значению DbNull в базе данных, а undefined указывает на отсутствие значения, которое не влияет на данные базы данных. Пример: lube.update('table', { a: undefined, b: null }); Результат выполнения SQL запроса: update table set b = DbNull

Внимание: при использовании ORM, по умолчанию Repository обновляет все поля, чтобы избежать проблем с типами данных или другими вопросами

Это правило также применяется к отношениям между объектами ORM, как показано ниже:

db.save(Employee, {
  id: 100,
  name: 'username',
  user: undefined,
  position: null
});

Этот код удалит связь position, но не затронет связь user.

По умолчанию типы данных (определены базой данных)

Конвертация типов данных JS в промежуточные типы:- Число -> DbType.int32

  • Строка -> DbType.string(DbType.MAX)
  • Логическое значение -> DbType.boolean
  • Буфер -> DbType.Binary(DbType.MAX)
  • ArrayBuffer -> DbType.Binary(DbType.MAX)
  • SharedArrayBuffer -> DbType.Binary(DbType.MAX)
  • Объект -> DbType.object<any>()
  • Массив -> DbType.array<any>()
  • UUID -> DbType.uuid
  • Десятичное число -> DbType.decimal## Создание моделей данных (рекомендовано использовать Code First)

Аспекты моделирования ORM Lubejs

Если первичный ключ не указан, то автоматически создается поле id как первичный ключ;

Использование декораторов

Использование декораторов и рефлексии в TypeScript находится в экспериментальной стадии, поэтому эта возможность временно недоступна.

Использование Map API для создания моделей

Скалярные столбцы

Энтитеты (Entity)

import { context, DbType } from 'lubejs';

/**
 * Энтитет "Человек"
 */
class Person {
  id: number;
  name: string;
  birthday: Date;
}

/**
 * Класс контекста базы данных
 */
class DefaultDbContext extends DbContext {
  get person(): Repository<Person> {
    return this.getRepository(Person);
  }
}

context(DefaultDbContext, builder => {
  const entity = builder.entity(Person)
  entity.column(p => p.id, Number).dbType(DbType.int32);
})

Ассоциативные связи

Один ко одному (основной)
Один ко одному (вспомогательный)
Один ко многим (основной)
Многие ко одному (вспомогательный)
Один ко многим (промежуточная таблица)

Используйте [многие ко многим (промежуточная таблица)](многие ко многим (промежуточная таблица)) вместо, но не указывайте атрибуты ссылки (они будут автоматически объявлены как скрытые).

Многие ко многим (промежуточная таблица)

Использование объекта хранилища Repository

Операции с ассоциативными связями
Когда ассоциативные связи сохраняются в базу данныхЕсли свойство отношения не было присвоено значением (то есть свойство не объявлено, Reflect.has(item, property) возвращает false; присваивание undefined или null также считается операцией изменения);
Один ко одному (вспомогательный)

Когда значение свойства существует Хранилище Repository сначала сохраняет связанное существо, затем обновляет его первичный ключ в качестве внешнего ключа текущей сущности, после чего сохраняет саму сущность.

Когда значение свойства отсутствует Хранилище Repository устанавливает внешний ключ текущей сущности равным null, затем сохраняет саму сущность.

Многие ко одному (вспомогательный)

Когда значение свойства существует Хранилище Repository сначала сохраняет связанное существо, затем обновляет его первичный ключ в качестве внешнего ключа текущей сущности, после чего сохраняет саму сущность.

Когда значение свойства отсутствует Хранилище Repository устанавливает внешний ключ текущей сущности равным null, затем сохраняет саму сущность.

Один ко одному (основной)

Когда значение свойства существует Хранилище Repository сначала сохраняет саму сущность, если текущее свойство связанного существа не является оригинальным связаным существом в базе данных, то оно будет автоматически удалено. Затем будет автоматически обновлён внешний ключ текущей сущности до последнего значения ключа. После этого сохранится связанное существо.Установка в null или undefined Хранилище Repository рассматривает это как операцию удаления связанного объекта.

Один ко многим (основной)

Когда значение свойства существует Хранилище Repository сначала сохраняет саму сущность; если коллекция связанных объектов содержит новые данные, они будут сохранены, если содержат уже существующие данные, они будут обновлены. Если связанные объекты в базе данных не находятся в текущей коллекции связанных объектов, то эти данные будут удалены.

Установка в null, undefined или [] Хранилище Repository рассматривает это как операцию очистки и удаляет все связанные объекты из базы данных.

Многие ко многим (промежуточная таблица)

Когда значение свойства существует Хранилище Repository сначала сохраняет саму сущность, затем сохраняет коллекцию связанных объектов, после чего выполняет следующие действия над промежуточной таблицей:

  • Элементы, существующие в коллекции и имеющие отношение в промежуточной таблице базы данных, остаются без изменений.
  • Элементы, существующие в коллекции, но отсутствующие в промежуточной таблице базы данных, добавляются как новые записи связи.
  • Элементы, отсутствующие в коллекции, но имеющие отношение в промежуточной таблице базы данных, удаляются как записи связи.[При установке значений null, undefined или []] Репозиторий очистит все записи связей в промежуточной таблице.

Все вышеописанные операции не приведут к удалению записей ассоциативной таблицы.

Расширенные связи

Фиктивные связи предназначены для предоставления дополнительной поддержки за пределами референтных связей базы данных. Фиктивные связи не создают никаких внешних ключей в базе данных.

Подзапросные свойства (только чтение)

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

Динамические свойства связи

Мы не будем применять жёсткие ограничения, а вместо этого будем определять целевые таблицы для внешних ключей через поле типа. Такое отношение называется динамической связью.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/jovercao-lubejs.git
git@api.gitlife.ru:oschina-mirror/jovercao-lubejs.git
oschina-mirror
jovercao-lubejs
jovercao-lubejs
master