Резюме статьи. Предполагая, что у вас уже есть структура веб-приложения Node / Express, узнайте, как легко добавить Sequelize ORM в свой проект.

Прежде чем мы начнем…

Что такое Sequelize и что такое ORM?

Это прямо из документации Sequelize: «Sequelize - это ORM на основе обещаний для Node.js v4 и выше. Он поддерживает диалекты PostgreSQL, MySQL, SQLite и MSSQL… ».

Что это обозначает? Что ж, ORM (объектно-реляционное сопоставление) - это уровень абстракции базы данных, который позволяет вам легко писать запросы, не записывая их в их исходной форме. Другими словами, это избавляет вас от необходимости писать прямые MySQL, PostgreSQL и т. Д. Это также дает вам легкий доступ к результатам запроса без необходимости самостоятельно сопоставлять их с объектами и т. Д. А Sequelize позволяет писать инструкции запроса в виде объектов javascript.

Нужен ли моему проекту ORM?

Этот вопрос действительно может накалить комнату увлеченных разработчиков. Не всем проектам нужна ORM. Я бы сказал, что для любых программ корпоративного уровня, у которых есть довольно тяжелые запросы, им не нужна ORM. Но я думаю, что их вполне приемлемо использовать для небольших проектов, особенно для базовых операций CRUD (создание, чтение, обновление, удаление). Также существует множество статей, в которых исследуются различия в скорости между ними (см. Это), которые предоставляют довольно убедительные доказательства того, что уровни ORM могут замедлить доступ к данным. Если вы не Netflix или Amazon, я бы сказал дерзайте. Это немного упростит вашу жизнь с данными и позволит ускорить настройку.

А теперь приступим ...

1) Установите Sequelize и его зависимости (вы также можете использовать пряжу)

npm i -s sequelize
npm i -s sequelize-cli
npm i -s mysql2

2) Инициализируйте инструкцию по настройке sequelize

sequelize init

Запустите это из основного корневого каталога вашего проекта. Это создаст в вашем проекте несколько каталогов, в том числе: /models, /migrations, /seeders и /config. Он также создаст основной файл точки входа Sequelize, index.js, внутри каталога /models, который синхронизирует все ваши модели с самого начала.

3) Создайте свою базу данных

Используя ваш любимый графический интерфейс для выбранного движка базы данных (мне нравится использовать Sequel Pro), выполните следующий запрос, чтобы создать свою базу данных:

CREATE DATABASE coolstuff;

Это необходимо сделать перед выполнением остальных инструкций по Sequelize и перед запуском вашего приложения; наш файл конфигурации требует подключения к базе данных, прежде чем любой из Sequelize действительно будет работать в реальном времени, так что ДЕЛАЙТЕ ЭТО СЕЙЧАС.

4) Введите информацию о конфигурации вашей базы данных.

В файле /config, созданном вашей предыдущей инструкцией, вам необходимо ввести фактическую информацию о подключении к базе данных, например:

{
  "development": {
    "username": "root",
    "password": null,
    "database": "coolstuff",
    "host": "127.0.0.1",
    "dialect": "mysql"
  },
  "test": {
    "username": "root",
    "password": null,
    "database": "coolstuff_test",
    "host": "127.0.0.1",
    "dialect": "mysql"
  },
  "production": {
    "username": "root",
    "password": null,
    "database": "coolstuff_production",
    "host": "127.0.0.1",
    "dialect": "mysql"
  }
}

Скорее всего, здесь вам не понадобится информация о тестовой и производственной конфигурации, если только вы не создаете продукт производственного уровня. Но я бы посоветовал оставить его здесь на случай, если вы ВЫЙДЕТЕ ВСЁ!

5) Создайте свою первую модель и миграцию с помощью sequelize-cli

sequelize model:create --name SearchHistory --attributes "search_term:string, search_type:string"

Это создаст файл модели с именем searchhistory.js в вашей папке /models. Он также создаст файл миграции в вашей /migrations папке, представляющий вашу первоначальную настройку таблицы. Осмотрите свой новый searchhistory.js файл, и вы заметите, что он создал красивое представление таблицы базы данных в javascript!

Вы спросите, для чего нужен файл миграции? Что ж, миграции позволяют легко управлять текущими изменениями в вашей базе данных. Если вы работаете в команде с большим количеством разработчиков, и кто-то создает новый столбец таблицы, а кто-то другой изменяет тип данных столбца, вы можете легко запустить инструкцию db:migrate, и она позаботится об изменениях за вас. Миграции позволяют легко создавать базу данных с нуля, они дают понять, в каком состоянии находится ваша база данных, и позволяют детерминированно перенести текущую версию базы данных на более новую. Вот пример файла миграции:

up: function (queryInterface, Sequelize) {
  return queryInterface.addColumn(
    'users',
    'age',
    Sequelize.INTEGER
  );
},
down: function (queryInterface, Sequelize) {
  return queryInterface.removeColumn('users', 'age');
}

Небольшое примечание об отслеживании изменений миграции: вам необходимо не только создать файлы миграции для изменений в базе данных, но вам также необходимо обновить свои model файлы, чтобы отразить изменения. Миграции позаботятся об изменении вашей фактической базы данных, но они не будут обновлять отображение / синхронизацию реляционной базы данных в вашем приложении (это делают файлы модели).

6) Добавьте инструкцию синхронизации Sequelize в точку входа вашего Node-приложения.

models.sequelize.sync().then(function() {
  server.listen(port);
  server.on('error', onError);
  server.on('listening', onListening);
});

Согласно документации Sequelize: «Когда приложение запускается, sequelize синхронизирует модели с базой данных, а затем запускает сервер. Таким образом, мы не загромождаем приложение при использовании функций продолжения ».

7) Запустите приложение!

npm start

Если вы правильно создали свою базу данных и предоставили правильную информацию о подключении в вашем /config файле, и ваш компьютер правильно использует MySQL (или выбранную вами базу данных), вы должны увидеть, что операторы CREATE TABLE IF NOT EXISTS выполняются во время запуска вашего сервера (при условии, что ваш узел / Экспресс-проект имеет встроенное логирование). Перейдите в программу графического интерфейса базы данных, и вы должны увидеть свои новые таблицы в своей базе данных!

Выполняемые запросы

Теперь, когда у вас есть Sequelize, интегрированный с вашим приложением, пора выполнить пару запросов! Полный список см. В документации.

Вы можете использовать свои модели, потребовав их непосредственно в любом из файлов вашего приложения:

const { SearchHistory } = require('./models');

Вы можете запустить это, чтобы получить все записи из своей таблицы:

SearchHistory.findAll().then(searchHistories => searchHistories);

Запустите это, чтобы получить конкретный элемент из своей таблицы:

SearchHistory.findOne({
  where: { 
    title: 'Best',
    type: 'book',
  },
}).then(title => title);

Что, если вы хотите создать JOIN с другим столом? Вы можете сделать что-то вроде этого, что даст вам доступ к связанным Books записям таблицы:

SearchHistory.findAll({
  where: { 
    title: 'Best',
    type: 'book',
  },
  include: [ Books ],
}).then(searchHistories => searchHistories);

Что делать, если вы хотите создать новую запись? Что делать, если вы хотите создать новую запись только, если она еще не существует? Вы можете использовать методы create и findOrCreate. Обратите внимание, что когда мы создаем новую запись, Sequelize вернет нам экземпляр этой записи со всеми только что созданными данными:

// Create a new record
SearchHistory.create(
  { title: 'Worst', type: 'book' },
).then(created => created);
// Check if already created; create a new one if not
SearchHistory.findOrCreate({
  where: { title: 'Bestest' }, 
  defaults: { title: 'Bestest', type: 'Book' },
}).then((book, created) => {
  if (created) {
    // do stuff here
  } else {
    // can update the instance here
    book.title = 'Altered';
    book.save();
  }
)};

В итоге

Sequelize поможет сохранить ваш проект Node / Express красивым и чистым. Он также научит вас хорошим принципам абстракции базы данных, которые вы можете использовать позже, даже если вы решите не использовать ORM. Я бы также предложил использовать async/await вместе с catchify, чтобы сделать код красивым и чистым:

const [err, searchHistories] = await catchify(  
  SearchHistory.findAll()
);

Надеюсь, вам понравилась эта статья, и что она вдохновит вас посмотреть «Титаник», если вы еще не… :)