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

Как использовать SEXELIZE ORM в вашей экспресс-приложении

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

Автор оригинала: Teo Deleanu.

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

Sequelize – 483K Еженедельные загрузки на момент написания – кажется самым стабильным с разницей в не используемом Mongo (что является предпочтительной базой данных MVP или проекта). Sequelize – это Node.js ORM на основе обещания для postgres, mysql, mariadb, sqlite и microsoft sql sql. Он имеет надежную поддержку транзакций, отношения, нетерпеливые и ленивые погрузки, прочитайте репликацию и многое другое. Плюсы:

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

Минусы:

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

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

  • SQLite – Легко использовать локальную базу данных без сервера, необходимого для запуска. Он будет использовать только локальный файл, поэтому он подходит для не одновременного доступа и приложений с одним сервером. Когда использовать SQLite: встроенные приложения, замена доступа к диску, тестирование Когда не использовать SQLite: Работа с большим количеством данных, высоким объемом записи, требуется доступ к сети.
  • MySQL – Это SQL SQL DE-FACTO, который имеет поддержку в большинстве старых языков. Nokia, Google, Facebook, YouTube использует его. Это позволяет нескольким пользователям подключаться к одному и тому же серверу и иметь разные базы данных. Также есть MySQL Workbench , один из самых подержанных пользовательских инструментов для MySQL, если вам не нравится MySQL CLI. Когда использовать MySQL: популярность и простота использования – так что вы легко найдете ресурсы об этом, безопасность, скорость и репликацию. Веб-сайты и веб-приложения, распределенные операции, ожидаемый будущий рост Когда не использовать MySQL: Известные ограничения – не хватает поддержки полных соединений, лицензирования и фирменных функций – некоторые функции не доступны в лицензии с открытым исходным кодом с 2009 года, были приобретены Oracle, а разработка новых функций была замедлена. Соответствие SQL необходимо, параллелизм и большие объемы данных. MySQL широко выбирается для веб-проектов, которые нуждается в базе данных только для простых транзакций данных. Это распространено, хотя для MySQL до underperform при напряжении тяжелых нагрузок или при попытке завершить сложные запросы. MySQL хорошо выполняет, когда требуются только скорости чтения. MySQL + InnoDB предоставляет очень хорошие скорости чтения/записи для разных сценариев. В целом MySQL хорошо работает с высокими сценариями параллелизма. MySQL является надежным и хорошо работает с приложениями бизнес-аналитики, так как приложения бизнес-аналитики, как правило, читаются.
  • Postgre : Postgresql’s PGADMIN Инструмент довольно удивительный и довольно полный, когда дело доходит до настройки и взаимодействия с вашим сервером. PostgreSQL широко используется в крупных системах, где читать и скорости записи имеют решающее значение, а данные должны подтвердить. Кроме того, он поддерживает различные оптимизации производительности, которые доступны только в коммерческих решениях, таких как поддержка геопространств, параллелизм без чтения замков. В целом, PostgreSQL Performance используется наилучшим в системах, требующих выполнения сложных запросов. PostgreSQL выполняет хорошо, когда требуются скорости чтения/записи, и необходим обширный анализ данных. PostgreSQL также хорошо работает с приложениями бизнес-аналитики, но лучше подходит для хранилища данных и приложений анализа данных, которые требуют быстрых скоростей чтения/записи. При использовании Postgres: целостность данных необходима, интеграция с другими инструментами, сложные операции – запросы могут быть распределены на нескольких процессорах. Когда не использовать Postgres: скорость является императивным – для повлиянных чтения, простые настройки, сложная репликация.
  • Мариадб Используется многими крупными корпорациями, дистрибутивами Linux и многое другое. Некоторые организации, которые используют Mariadb, включают Google, Craigslist, Wikipedia, Archlinux, Redhat, CentOS и Fedora. Mariadb – это вилка MySQL, поэтому большинство функций совместимы, включая запросы и индексы.
  • Утомительно – Microsoft SQL Server Очень похоже на MySQL, а также вилку из него. С MSSQL вы создаете базу данных и не указываете разные двигатели. Как правило, дорого бежать, потому что вам нужны лицензии на сервер запущены программное обеспечение. Если вы используете .NET, у вас есть некоторые преимущества, но это не наше дело. С другой стороны, вы можете продлить существующую функциональность с узлом, подключенным непосредственно к MSSQL.

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

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

$ 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](https://www.npmjs.com/package/pg) 680K vs [HStore deserializer](https://www.npmjs.com/package/pg-hstore) 80K AMT
$ npm install --save mysql2 # [Mysql](https://www.npmjs.com/package/mysql2) 198K weekly downloads ATM
$ npm install --save mariadb #  [MariaDB connector](https://www.npmjs.com/package/mariadb) 5K weekly downloads ATM
$ npm install --save tedious # [Microsoft SQL Server](https://www.npmjs.com/package/mssql) - 80K downloads ATM

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

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

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

node_modules/.bin/sequelize init

Это будет генерировать некоторые папки Config/config.js, сеялки, модели/index.js, миграции.

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

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

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. Среди вариантов вы можете использовать: VEV-переменная, SSL, хост, порт, полное соединение строки, хранение, имени базы данных, диалекторы, протокол (TCP или NULL для Heroku), журнал (можно установить на NULL или COUNCOLE.LOG), синхронизировать: {Force: True}, бассейн (Макс.: 5, простаистый: 30000, приобретает: 60000). Более подробную информацию с параметрами Sequelize на Coonfig можно найти на Sequelize Doc Page ).

Теперь давайте создадим пользователь. Вы можете использовать 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');
  }
};

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

$ 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 запустить тест В коде все проверит для вас. Чтобы установить, что проверяйте статью с BDD тестирование Отказ Вы также можете настроить качество кода и обнаружение ошибок довольно легко с Eslint Отказ

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

PS: Эта статья была впервые опубликована на appseed.us blog Отказ