А так же о всякой фигне
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();
Комбинируем условия(where) и лимит+офсет
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 });
Создаём REST API сервер на Hapi часть 5: Авторизация
Авторизацией в hapi занимаются отдельные модули, в нпм репозитории их куча, на любой вкус. Мне приходилось работать только с bearer токенами, про них я и расскажу.
Продвинутое использование ORM Sequelize
В этот раз мы углубимся в join реквесты, сеттеры и ещё пару вещей, а для затравки разберём пару простых методов: