Рубрики
Без рубрики

Объектно-реляционное отображение в Node.js с секвенированием

Sequelize легко учиться и имеет десятки прохладных функций. Время узнать, как его использовать, чтобы вы могли сделать эффективную ORM в Node.js.

Автор оригинала: Hari Das.

Задний план

Реляционное отображение объекта (ORM) – это процесс сопоставления между объектами и системами реляционных баз данных. Так что он действует как интерфейс между двумя системами, скрывающими детали о базовом механизме. В этом универсальном мире систем баз данных также не на 100% – способ доступа к данным отличается. Когда дело доходит до миграции между базами данных, ORM может быть вариантом, если вы хотите избежать трафарета времени и усилий. Вот некоторые преимущества ORM на традиционном подходе на запрос:

  • Разработчики могут сосредоточиться только на бизнес-логике, а не записать интерфейсы между кодом и БД.
  • Уменьшает время и затраты в разработке, избегая избыточных кодов
  • Способен подключаться к различным базам данных, что пригодится во время переключения с одной БД на другую.
  • Помогает эффективно запросить из нескольких таблиц, аналогичных SQL Join-Orm, берет на себя ответственность преобразования объектно-ориентированного подхода запроса к SQL-запросам.

Вступление

В этой статье мы узнаем, как сделать эффективный объект-реляционный сопоставление с Sequelize В Node.js. Есть пара других альтернатив, но этот модуль мой любимый. Sequelize легко изучать и имеет десятки прохладных особенностей, таких как синхронизация, ассоциация, проверка и т. Д. Это также имеет поддержку PostgreSQL, MySQL, Mariadb, SQLite и MSSQL.

[[ Клон от github ]]

Как начать ?

Таким образом, наша цель здесь состоит в том, чтобы понять его функциональность, создавая пример приложения, которое выполнит некоторые основные операции с CRUD. Я предполагаю, что у вас есть Node.js и PostgressQL установлены.

Приложение стартера

Давайте использовать «Express Application Generator» для создания приложения стартера (кто хочет изобретать колесо, амирит?).

npm install express-generator -g
express testapp

Чтобы установить Sequelize, Postgres и EJS (Template Engine), перейдите к корню из созданной папки.

npm install --save sequelize
npm install --save pg pg-hstore
npm install --save ejs

Мы будем использовать EJS для шаблонов вместо нефрита. Таким образом, мы можем удалить смежные зависимости и файлы JADE из проекта Express, созданный по умолчанию.

DB подключение и модели

Подключение к Postgres так же просто, как одна строка

var sequelize = new Sequelize('postgres://username:password@localhost:5432/db_name');

Модели – это объекты, которые представляют таблицы в базе данных. Это сердце ORM, и мы можем определить их с Sequelize.define Отказ Наша модель пользователей выглядит так:

var User = sequelize.define('user', {
  firstName: {
    type: DataTypes.STRING,
    allowNull: false,
    unique: 'compositeIndex'
  },
  lastName: {
    type: DataTypes.STRING,
    unique: 'compositeIndex'
  },
    .........
    .........
    .........
  dateJoined: {
    type: DataTypes.DATE,
    defaultValue: DataTypes.NOW
  }
}, {
  getterMethods   : {
    address: function()  { return this.state + ', ' + this.country }
  },
  setterMethods   : {
    address: function(value) {
      var names = value.split(', ');
      this.setDataValue('country', names[0]);
      this.setDataValue('state', names[1]);
    },
  }
});

Вам просто нужно определить столбцы и их типы данных и Sequelize автоматически добавляют Создать и Updatedat к вашей модели. Есть несколько других настроек, которые вы также можете настроить для ваших столбцов.

  • Allowlull – Установите false, если нуль не допускается
  • DefaultValue – Установите значение по умолчанию для столбца. Пример: Datatypes.now для datejoed столбец.
  • Автоинцемент – автоматически увеличивает столбец на один каждый раз, когда вставлена новая строка
  • Комментарий – Упомяните комментарий для вашей колонки
  • Уникальный – Укажите логическое значение, чтобы определить столбец как уникальную. Для композитной клавиши строка можно упомянуть для нескольких столбцов.

Пример

 userId: {type: Sequelize.STRING, unique: true},
 fullName: { type: Sequelize.STRING,  unique: 'compositeIndex'},
 dob: { type: Sequelize.DATE, unique: 'compositeIndex'}

Методы добыча и установки

В Sequelize мы можем определить псевдо свойства на модели. Эти свойства не являются фактической частью схемы базы данных, они только для моделей. В приведенном выше примере «адрес» представляет собой псевдо-свойство, и его значение инициализируется через методы Getter и Setter. Когда государство и страна извлечены из БД, Sequelize объединяет их с запятой для заполнения свойства «Адрес» (Gettermethods). Точно так же, когда мы установим адрес, он разделен в состояние и страну (Settermethods). Таким образом, «адрес» кажется столбце в БД, но на самом деле это нет.

Подготовка данных образца

Есть разные подходы для создания новой записи в БД. Первый подход состоит в том, чтобы построить не постоянный объект, а затем вызовите сохранение (), чтобы сохранить данные.

var newUser = user.build({
  firstName: 'John', 
  lastName: 'Doe', 
  age: 28, 
  country: 'US', 
  state: 'Indiana', 
  email: 'johndoe@example.com'
});
newUser.save().then(function() {
  // Do stuffs after data persists
})

Другая альтернатива – сделать как шаги в одной строке, используя user.create ({.....}). Затем (функция (пользователь) {}) Отказ Если нам нужно создать объемные экземпляры, вот как мы это делаем.

user.bulkCreate([USERS],{ validate: true }).then(function() {
  // Congratulate user!
}).catch(function(errors) {
  // Catch  if validation failed
  // Print errors
});

Проверьте ./routes/createdata.js В выборке проекта для логики создания объема. Перейти с шагами на localhost: 3000 Чтобы увидеть операции в прямом эфире, когда мы обсуждаем дальше.

Запрос данных

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

Секвентифицировать

Получите первые 100 пользовательских экземпляров. Выделенная колонна в изображении выше поставляется из таблицы «Группа».

user.findAll({limit: 100}).then(function(users) {
  // Send array to view
});

Получить пользователя по электронной почте

user.findOne({where : {email: 'johndoe@example.com'}}).then(function(user) {
  // Send user to view
});

Немного более сложный пример. Найдите всех пользователей California и Arizona, возраст которой находится между 20 и 40 и фамилия содержит «пользователь».

var query = {};
query.where = {
  $or: [
    {state: "California"},
    {state: "Arizona"}
  ],
  age: {
    $between: [20, 40]
  },
  lastName: {
    $ilike: '%user%'
  }
};
user.findAll(query).then(function(users) {
  // Do something awesome here
});	

Таким образом, эквивалентный запрос SQL

SELECT "id", "firstName", "lastName", "email", "age", "country", "state", "dateJoined", "createdAt", "updatedAt"
FROM "user" AS "user"
WHERE ("user"."state" = 'California' OR "user"."state" = 'Arizona')
  AND "user"."age" BETWEEN 20 AND 40
  AND "user"."lastName" ILIKE '%user%';
Секвентифицировать

Если вам нужно больше операторов для запросов данных, вы можете найти Список здесь Отказ

Sequelize также предлагает возможность напрямую предоставить запрос SQL, например:

sequelize.query(QUERY, { model: user }).then(function(users) {
  // Array of instance of user
})

Обновления и уничтожение

Обновление экземпляра может принимать два параметра, обновленные значения и где условие.

user.update({
  firstName: "John",
  lastName: "Doe",
  address: "Nevada, US"
},{
  where: { email : "johndoe@example.com" }
})
.then(function () { 

});

«Уничтожить» также занимает состояние где (см. Ниже). Вы также можете выполнить синтаксис обратного вызова (просто как обновление), чтобы сделать какую-то логику после уничтожения.

user.destroy({
  where: {
    email: 'johndoe@example.com'
  }
});
// DELETE FROM user WHERE email = 'johndoe@example.com';

Отношение и ассоциации

В этом разделе мы узнаем об объединении в одну к одной. Когда две модели связаны друг с другом одним иностранным ключом, мы говорим это как единое объединение. В нашем случае у нас есть две модели: пользователь и группа. Каждый пользователь связан с одной группой. Таким образом, у пользователя модели имеет внешний ключ group_id какие указывает на ГРУПИД группы группы. Определение этой ассоциации очень проста в секвенировании.

user.belongsTo(group, {foreignKey: 'group_id', targetKey: 'groupId'});

После выполнения строки указана, она создает внешний ключ «GROUP_ID» для модели группы. Чтобы прочитать данные из обеих таблиц (например, присоединиться к SQL), просто включите целевую модель следующим образом:

user.findAll({
  limit: 100,
  include: [{
    model: group
  }]
}).then(function(users) {
  // Send users to view
});

Обертывание

В Sequelize есть больше функций, таких как управление транзакциями, крючки, обшивки и т. Д. Сочетание всех этих функций Sequelize становится сильным модулем ORM для Node.js. Но когда дело доходит до сложных отношений и ассоциаций, кажется, немного диммед и ремонтопригодность может быть заботой. Но кроме того, это пуленепробиваемый модуль с хорошо описанной документацией.