Всё о web

Для чайников и не только


Как использовать ORM Sequelize

Январь 27, 2019

Sequelize - это ORM библиотека для nodejs. Sequelize поддерживает PostgreSQL, MySQL, SQLite и MSSQL диалекты.

Как обычно сперва поставим всё необходимое:

npm i sequelize sqlite

Подключение Sequelize

Для начала, нужно создать новый экземпляр sequelize, в качестве тестовой базы данных будем использовать sqlite:

const Sequelize = require('sequelize'); //Подключаем библиотеку
const config =  {
  username: 'root',
  password: null, // Для sqlite пароль не обязателен
  database: 'test_db', // Имя базы данных
  host: '127.0.0.1', // Адрес субд, для sqlite всегда локалхост
  dialect: 'sqlite', // Говорим, какую СУБД будем юзать
  dialectOptions: {
    multipleStatements: true
  },
  logging: console.log, // Включаем логи запросов, нужно передать именно функцию, либо false
  storage: './test_db.db', // Путь к файлу БД
  operatorsAliases: Sequelize.Op // Передаём алиасы параметров (дальше покажу нафига)
}
let sequelize = new Sequelize(config); // Создаём подключение

Ели где-то в проекте мы ещё раз попробуем вызвать конструктор sequelize с теми же параметрами, то конструктор вернут тот же объект, так как sequelize юзает синглтон.

Описание схемы данных

Для примера создадим 2 таблички, posts и comments.

// Создаём описание таблички posts
let posts = sequelize.define('posts', {
  id: {
    allowNull: false,
    autoIncrement: true,
    primaryKey: true,
    type: Sequelize.DataTypes.INTEGER
  },
  title: {
    type: Sequelize.DataTypes.STRING,
    allowNull: false
  },
  body: {
    type: Sequelize.DataTypes.STRING
  }
}, {
  timestamps: true // Колонки createdAt и updatedAt будут созданы автоматически
});

// И комменты
let comments = sequelize.define('comments', {
  id: {
    allowNull: false,
    autoIncrement: true,
    primaryKey: true,
    type: Sequelize.DataTypes.INTEGER
  },
  posts_id: { // Связь с табличкой posts
    type: Sequelize.DataTypes.INTEGER,
    allowNull: false
  },
  userName: {
    type: Sequelize.DataTypes.STRING,
    allowNull: false
  },
  comment: {
    type: Sequelize.DataTypes.STRING,
    allowNull: false
  }
}, {
  timestamps: true // Колонки createdAt и updatedAt будут созданы автоматически
});

Сейчас у нас есть схемы табличек, но нет базы данных, для того, чтобы sequelize синхронизировал схему данных с реальной (но пока не созданной) БД, нужно выполнить:

await sequelize.sync();

Осторожно с синхронизацией, на живых проектах это не безопасно.

Создание записей

Добавим новый пост:

  let newPost = {
    title: 'Post title 1',
    body: 'Ololo ololo ya voditel NLO'
  }
  let newDBRecord = await sequelize.models.posts.create(newPost);

В newDBRecord будет содержаться новая запись, которую вернула БД.

И то же самое для таблички комментов:

  let newComment = {
    posts_id: 1,
    userName: 'Ololoev',
    comment: 'Preved medved'
  }
  let newDBComments = await sequelize.models.comments.create(newComment);

Обновление данных

let newDBComments = await sequelize.models.comments.update({ userName: 'Ololoev_O' }, { where: { id: 1 } });

В качестве параметров НЕ нужно передавать полный объект, а достаточно передать только те поля, именно которые требуется обновить. Условия можно использовать любые, как и в findAll/findOne

Поиск по ID

let data = await sequelize.models.posts.findOne({ where: { id: 1 } });
console.log(data.dataValues);

При использовании findOne вернётся либо undefined, если ничего не найдено, либо объект с данными.

Поиск всех записей по параметрам

Метод вернёт массив. В случае, если ничего не найдено- пустой массив.

let data = await sequelize.models.posts.findAll();

Комбинируем условия(where) и лимит+офсет

let data = await sequelize.models.posts.findAll({ where: {}, limit: 2, offset: 1});

Более подробно по условиям

Логическое И(AND) в условиях работает обычным перечислением параметров:

let whereAND = {
  id: 1,
  userName: 'Ololoev'
}
let data = await sequelize.models.comments.findAll({ where: whereAND });

Логическое ИЛИ(OR), условия перечисляются в массиве

let whereOR = {
  [Sequelize.Op.or]: [
    {
      id: 2
    },
    {
      userName: 'Ololoev'
    }
  ]
}
let data = await sequelize.models.comments.findAll({ where: whereOR });

Если нужно сделать ИЛИ для какой-то одной колонки:

let whereOR2 = {
  id: { 
    [Sequelize.Op.or]: [ 1, 2 ]
  }
}
let data = await sequelize.models.comments.findAll({ where: whereOR2 }); 

Логическое НЕ(NOT)

let whereNOT = {
  id: {
    [Sequelize.Op.ne]: null
  }
}
let data = await sequelize.models.comments.findAll({ where: whereNOT });



Комментарии

Оставить комментарий:

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