хуйу нас не матерятся
Sequelize - это ORM библиотека для nodejs. Sequelize поддерживает PostgreSQL, MySQL, SQLite и MSSQL диалекты.
Как обычно сперва поставим всё необходимое:
npm i sequelize sqlite
Для начала, нужно создать новый экземпляр 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
let data = await sequelize.models.posts.findOne({ where: { id: 1 } });
console.log(data.dataValues);
При использовании findOne вернётся либо undefined, если ничего не найдено, либо объект с данными.
Метод вернёт массив. В случае, если ничего не найдено- пустой массив.
let data = await sequelize.models.posts.findAll();
let data = await sequelize.models.posts.findAll({ where: {}, limit: 2, offset: 1});
await sequelize.models.posts.destroy({ where: { id: 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 });
Материал супер!