Как использовать Sequelize ORM в вашем приложении Express

Добавление и ORM или выбор одного из них определенно непростая задача. Но скорость, которую это принесет вам кодирование, имеет решающее значение.
Я быстро проверил один из ORM, доступных для JS. здесь.
Для тех из вас, кто предпочитает только реляционные базы данных на основе SQL, вы можете использовать Sequelize.
Это основная причина, по которой мы выбрали его для этого примера.

Сиквел — 483 000 еженедельных загрузок на момент написания статьи — кажется наиболее стабильным с той разницей, что не используется монго (который является предпочтительной базой данных или проектом MVP).
Sequelize — это ORM Node.js на основе обещаний для Postgres, MySQL, MariaDB, SQLite и Microsoft SQL Server. Он обеспечивает надежную поддержку транзакций, отношения, нетерпеливую и ленивую загрузку, репликацию чтения и многое другое.
PRO:

  • Sequelize абстрагируется от тонких различий между различными реализациями SQL.
  • В Sequelize реализовано промежуточное программное обеспечение, которое позволяет настраивать сообщение об ошибке для сбоев в каждом поле.
  • Sequelize предоставляет библиотеку на основе обещаний, которая помогает лучше управлять исключением и результатом, когда он непредвиден.
  • Имеет возможность «синхронизировать» базу данных по измененным моделям. Таким образом, он изменит или автоматически создаст таблицы для вас.
  • Имеет возможность запрашивать все сложные соединения для вас. Вам просто нужно научиться соединять Объекты друг с другом.

Минусы:

  • Sequelize иногда генерирует сложные запросы. В определении модели иногда неправильно понимается отношение, когда отношение имеет значение «hasOne».
  • В Sequalize отсутствует поддержка NoSQL: хотите использовать Mongo? Должен переключиться.
  • Имеет некоторые странные исключения, когда что-то происходит, и вы хотите создать больше подключений к БД. Для этого вы можете использовать пул соединений.

Наиболее существенным преимуществом ORM (Object Relationship Model) является быстрое переключение между любыми базами данных SQL. Поэтому, если вы начали с SQLite в качестве локальной базы данных и хотите на следующей неделе переключиться на MySQL или Postgre, вы просто меняете коннектор.

  • SQlite — простая в использовании локальная база данных без необходимости запуска сервера. Он будет использовать только локальный файл, поэтому он подходит для неконкурентного доступа и приложений с одним сервером.
    Когда использовать SQLite: встроенные приложения, замена доступа к диску, тестирование
    Когда не использовать SQLite: работа с большим количеством данных, большой объем записи, требуется доступ к сети.
  • MySQL — это де-факто SQL-сервер, который поддерживает большинство старых языков. Его используют Nokia, Google, Facebook, YouTube. Это позволяет нескольким пользователям подключаться к одному и тому же серверу и иметь разные базы данных. Также имеет рабочая среда mysqlодин из наиболее часто используемых инструментов пользовательского интерфейса для MySQL, если вам не нравится MySQL CLI.
    Когда использовать MySQL: Популярность и простота использования — так что вы легко найдете ресурсы о нем, безопасности, скорости и репликации. Веб-сайты и веб-приложения, Распределенные операции, Ожидаемый рост в будущем
    Когда не использовать MySQL: Известные ограничения — отсутствует поддержка ПОЛНЫХ соединений, лицензирования и проприетарных функций — некоторые функции недоступны в лицензии с открытым исходным кодом, так как 2009 г. была приобретена Oracle, и разработка новых функций замедлилась. Необходимо соответствие SQL, параллелизм и большие объемы данных.
    MySQL широко используется для веб-проектов, которым требуется база данных только для простых транзакций данных. Тем не менее, для MySQL характерно снижение производительности при больших нагрузках или при попытках выполнить сложные запросы.
    MySQL хорошо работает, когда требуется только скорость чтения. MySQL + InnoDB обеспечивает очень хорошие скорости чтения/записи для различных сценариев. В целом, MySQL хорошо работает в сценариях с высокой степенью параллелизма. MySQL надежен и хорошо работает с приложениями бизнес-аналитики, поскольку приложения бизнес-аналитики обычно требуют большого количества операций чтения.
  • постгре: PostgreSQL PGAdmin Инструмент довольно классный и довольно полный, когда дело доходит до настройки и взаимодействия с вашим сервером. PostgreSQL широко используется в больших системах, где скорость чтения и записи имеет решающее значение, а данные необходимо проверять. Кроме того, он поддерживает множество оптимизаций производительности, которые доступны только в коммерческих решениях, таких как поддержка геопространственных данных, параллелизм без блокировки чтения.
    В целом, производительность PostgreSQL лучше всего используется в системах, требующих выполнения сложных запросов. PostgreSQL хорошо работает, когда требуется скорость чтения/записи и требуется тщательный анализ данных.
    PostgreSQL также хорошо работает с приложениями бизнес-аналитики, но лучше подходит для приложений хранилища данных и анализа данных, которым требуется высокая скорость чтения/записи.
    Когда вы используете Postgres: важна целостность данных, интеграция с другими инструментами, сложные операции — запросы могут быть распределены по нескольким процессорам.
    Когда не следует использовать Postgres: скорость обязательна — для быстрого чтения, простых настроек, сложной репликации.
  • МарияДБ используется многими крупными корпорациями, дистрибутивами Linux и другими. Некоторые организации, которые используют MariaDB, включают Google, Craigslist, Wikipedia, archlinux, RedHat, CentOS и Fedora. MariaDB — это ответвление Mysql, поэтому большинство функций совместимы, включая запросы и индексы.
  • утомительно — Microsoft SQL Server Очень похож на MySQL, а также является ответвлением от него. С MSSQL вы создаете базу данных и не указываете разные механизмы. Как правило, это дорого для запуска, потому что вам нужны лицензии на сервер, на котором работает программное обеспечение. Если вы используете .NET, у вас есть некоторые преимущества, но это не наш случай. С другой стороны, вы можете расширить существующую функциональность, подключив Node напрямую к MSSQL.

Теперь вернемся к нашему Sequelize ORM.
Для нашего примера мы выберем самый простой способ: Склайт — 20 000 еженедельных загрузок, так как не имеет конфигурации для серверной части.
Если вам нужны более сложные примеры по заданной теме, пожалуйста, прокомментируйте в разделе ниже.

Давайте начнем устанавливать вещи вокруг:

$ npm install --save sequelize # This will install v5

$ npm install --save sqlite3

# Optionally add other db connectors - but you will need only one at a time
# keep your code clean and remove the unused ones from package.json
$ npm install --save pg pg-hstore # [Postgres]( 680K vs [HStore deserializer]( 80K AMT
$ npm install --save mysql2 # [Mysql]( 198K weekly downloads ATM
$ npm install --save mariadb #  [MariaDB connector]( 5K weekly downloads ATM
$ npm install --save tedious # [Microsoft SQL Server]( - 80K downloads ATM

Это была легкая часть. На самом деле мы должны захотеть использовать также sequelize-cli.

$ npm install --save --only=dev sequelize-cli

Теперь мы хотим создать файлы конфигурации по умолчанию.

node_modules/.bin/sequelize init

Это создаст несколько папок config/config.js, seeders, models/index.js, миграции.

Не имеет отношения к этой теме: В Приложение PRO версии вы также можете настроить все для простой проверки качества кода в VSCode. Вы даже можете получить весь вышеуказанный код бесплатно и использовать его самостоятельно. Лицензия MIT.
Файл index.js получает все модели, которые вы создадите под models папку и загружает их во время выполнения. Он также называет sync метод для вас, чтобы убедиться, что БД обновлена.

Давайте посмотрим на файл конфигурации:

module.exports = {
    development: {
        dialect: 'sqlite',
        storage: './db.development.sqlite'
    },
    test: {
        dialect: 'sqlite',
        storage: ':memory:'
    },
    production: {
        username: process.env.DB_USERNAME,
        password: process.env.DB_PASSWORD,
        database: process.env.DB_NAME,
        host: process.env.DB_HOSTNAME,
        port: process.env.DB_PORT,
        dialect: 'mysql',
        use_env_variable: 'DATABASE_URL'
    },
    production2: {
        use_env_variable:"DB_CONNECTION_STRING",
        dialect: "postgres",
        ssl: true,
        dialectOptions: {
            ssl: true
        }
    }
};

Как видите, вы можете использовать разные конфигурации для своей базы данных в зависимости от среды. Это должно соответствовать переменной ENV из вашего файла .env.
Среди параметров, которые вы можете использовать: переменная env, ssl, хост, порт, полная строка подключения, хранилище, имя базы данных, dialectOptions, протокол (tcp или null для Heroku), ведение журнала (может быть установлено значение null или console.log), синхронизация : { force: true }, pool (максимум: 5, бездействие: 30 000, приобретение: 60 000). Более подробную информацию о параметрах продолжения на coconfig можно найти на Упорядочить страницу документа).

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

node_modules/.bin/sequelize model:create --name User --attributes name:string,surname:string,email:string,password:string

Самое классное, что это автоматически генерирует полную модель. Если вы хотите, вы можете скопировать идентификатор из миграции и добавить его туда. id: DataTypes.INTEGER

'use strict';
module.exports = (sequelize, DataTypes) => {
  const User = sequelize.define('User', {
    name: DataTypes.STRING,
    surname: DataTypes.STRING,
    email: DataTypes.STRING,
    password: DataTypes.STRING
  }, {});
  User.associate = function(models) {
    // associations can be defined here
  };
  return User;
};

Кроме того, он также генерирует миграцию для этой модели таблицы.

'use strict';
module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable('Users', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      name: {
        type: Sequelize.STRING
      },
      surname: {
        type: Sequelize.STRING
      },
      email: {
        type: Sequelize.STRING
      },
      password: {
        type: Sequelize.STRING
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATE
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE
      }
    });
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable('Users');
  }
};

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

$ sequelize migration:generate --name [name_of_your_migration]

Но вернемся к самой прекрасной части нашей жизни: программированию!!!
В ваши методы вы должны включить модели. Я бы предложил отделить модели и доступ к базе данных от ваших обработчиков маршрутов API.

const User        = require('../../models').User;

//get some fake data for example
const faker = require('faker');
const email = faker.internet.email();
const password = faker.internet.password();
const firstName = faker.name.firstName();
const lastName = faker.name.lastName();
const body = {email: email, password: password, name: lastName, surname: firstName};

//create a user
const newUser = await User.create(body);

//find the user
let user = await User.findOne({where: {email}});

//destroy the user with the object, this will call DELETE where id = our_user_id automatically.
await user.destroy();

И теперь у нас есть весь цикл для объекта.

Бонус 1: Помимо обычного цикла одного пользователя, вы можете захотеть отобразить всех пользователей на панели администратора:


let limit = 50;   // number of records per page
let offset = 0;
try{
    const data = await User.findAndCountAll();
    let page = req.params.page;      // page number
    let pages = Math.ceil(data.count / limit);
    offset = limit * (page - 1);
    const users = User.findAll({
        attributes: ['id', 'name', 'surname', 'email'],
        limit: limit,
        offset: offset,
        $sort: { id: 1 }
    });
    // next return an object that describes
    // the page and offset
    // this ensures you can display pages
    // and give to the ui the option
    // to display this to the user
    return {
        page,
        pages,
        offset,
        users
    };
}catch(err){
    //do something with your status like in the commented example
    //res.status(500).send('Internal Server Error');
} 
});

Бонус 2: вы можете использовать Джой для проверки ваших данных на стороне маршрута, прежде чем добавлять их в модель.

const Joi         = require('joi');
const userSchema = Joi.object().keys({
    username: Joi.string().alphanum().min(3).max(30).optional(),
    password: Joi.string().required(),
    email: Joi.string().email({ minDomainAtoms: 2 }).required(),
    name: Joi.string().alphanum().min(2).max(100).optional(),
    surname: Joi.string().alphanum().min(2).max(100).optional()
});
//....
const result = Joi.validate(user, userSchema);
if(result.error){
    return res.status(422).json({
        errors: result.error
    });
}

Бонус 3:
Вызов npm run test в коде все проверит за вас. Чтобы настроить это, проверьте статью с BDD-тестирование.
Вы также можете легко настроить качество кода и обнаружение ошибок с помощью ESLint.

Пожалуйста, дайте мне знать ваше мнение об этой статье в разделе комментариев ниже. Буду рад ответить на ваши запросы.

PS: эта статья была впервые опубликована на блог appseed.us.

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *