Задний план
Реляционное отображение объекта (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. Но когда дело доходит до сложных отношений и ассоциаций, кажется, немного диммед и ремонтопригодность может быть заботой. Но кроме того, это пуленепробиваемый модуль с хорошо описанной документацией.