1.17M
Category: databasedatabase

Sequelize CLI models migrations

1.

фаза 1 · неделя 3 · день 2
Sequelize CLI
models
migrations

2.

План
1. Sequelize CLI
2. Модели
3. Миграции
4. Методы моделей
5. Каскадное удаление

3.

Sequelize CLI

4.

Sequelize CLI
CLI (command line interface) — интерфейс командной строки.
Sequelize CLI — программа для работы с Sequelize ORM из терминала.
npm i -D sequelize-cli
npx sequelize init

5.

Sequelize CLI
Sequelize CLI создаёт 4 директории в корневой папке:
● config/
● models/
● migrations/
● seeders/

6.

Sequelize CLI
config/
config.json
Реквизиты подключения к БД — имя и пароль пользователя БД, название
базы, хост, порт, etc.
models/
index.js — само подключение к базе данных.
+ модели для работы с БД.

7.

Sequelize CLI
migrations/
Миграции для изменения структуры БД.
seeders/
Сидеры для начального заполнения данными.

8.

.sequelizerc
Специальный файл конфигурации, который должен находиться в корне
папки с проектом. Он позволяет указывать различные параметры, которые
обычно передаются в качестве аргументов в CLI.
Некоторые сценарии, в которых вы можете его использовать:
● вы хотите отменить заданные по умолчанию пути к папке migrations,
models, seeders или config.
● вы хотите переименовать config.json во что-то другое, например
database.json

9.

Модели

10.

Модель
Класс с описанием таблицы в базе данных.
Экземпляры этого класса описывают записи в таблице.
Создать модель можно через Sequelize CLI командой model:generate

11.

Создание модели
Команда model:generate требует следующие флаги:
--name — название модели.
--attributes — описание столбцов для таблицы.
ID прописывать не нужно — Sequelize CLI опишет его самостоятельно.

12.

Создание модели
npx sequelize model:generate --name User --attributes
username:text,firstName:text
Эта команда создаст модель User с полями username и firstName.
Список типов данных Sequelize: https://sequelize.org/v5/manual/data-types.html

13.

Структура модели
class User extends Model {
/* ... */
}
User.init(
{
// атрибуты модели — каждый ключ описывает колонку в таблице
username: DataTypes.TEXT,
firstName: DataTypes.TEXT,
},
{
// дополнительные опции модели
},
);

14.

Структура модели
Созданную модель можно и порой нужно редактировать.
Чем точнее описаны ограничения (например, references, notNull, unique,
etc.), тем лучше.
Список доступных настроек в документации по методу init:
https://sequelize.org/master/class/lib/model.js~Model.html#static-method-init

15.

Структура модели
User.init({
// атрибут, описанный детально
username: {
type: DataTypes.TEXT,
unique: true,
allowNull: false,
},
// ...
});

16.

Структура модели
Для связи One-To-Many необходимо в ассоциациях моделей вызвать методы
.belongsTo и .hasMany
class Post extends Model {
static associate({ Student }) {
this.belongsTo(Student, { foreignKey: 'authorId' });
}
}
class Student extends Model {
static associate({ Group, Post }) {
this.hasMany(Post, { foreignKey: 'authorId' });
}
}

17.

Миграции

18.

Миграции
Миграция — способ описать изменения в структуре БД.
Файл миграции содержит две функции:
● up
Код для изменения структуры БД.
● down
Код для возврата к предыдущей структуре до этих изменений.

19.

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

20.

Миграции
Чтобы описанные в миграции изменения были выполнены, необходимо её
применить — то есть, вызвать функцию up.
Команда db:migrate запустит все непримененные миграции по очереди:
npx sequelize db:migrate

21.

Миграции
Список уже применённых
миграций можно проверить в
таблице SequelizeMeta.
Эту таблицу Sequelize CLI
создаёт автоматически.

22.

Отмена миграций
Отмена миграции — это вызов функции down из файла миграции.
db:migrate:undo
Отменяет последнюю миграцию.
db:migrate:undo:all
Отменяет все миграции по очереди — от самой поздней к самой ранней.

23.

Отмена миграций
Чтобы откатиться до конкретной миграции, можно использовать флаг --to и
название этой миграции:
npx sequelize db:migrate:undo:all --to XXXXXXXXXXXXXX-createposts.js

24.

Изменение миграции
Миграцию можно менять только в следующих случаях:
● эта миграция ещё не была применена к какой-либо БД
● эта миграция была отменена для всех БД, где её ранее применяли.
Если вы закоммитили миграцию и опубликовали её — менять эту миграцию
не стоит.

25.

Связи таблиц
Для связи One-To-Many в миграциях на внешний ключ добавляем поле references:
// Миграция таблицы Posts
authorId: {
type: Sequelize.INTEGER,
references: {
model: 'Students',
key: 'id',
},
allowNull: true,
onDelete: 'SET NULL',
}

26.

Методы
моделей

27.

Методы моделей
У Sequelize-моделей есть методы для всех CRUD-операций с записями.
INSERT → Model.create()
SELECT → Model.findAll()
UPDATE → Model.update()
DELETE → Model.destroy()
Все эти методы возвращают промис и могут принимать объект с
параметрами.

28.

create
Метод create создает экземпляр модели и сохраняет его в БД.
const user = await User.create({
name: 'Igor',
email: '[email protected]',
});

29.

findAll
Метод findAll() выполняет команду SELECT и возвращает промис со всеми
совпадениями.
const users = await User.findAll(); // SELECT * FROM users;

30.

findAll — attributes
Можно выбирать конкретные столбцы через параметр attributes:
// SELECT name, email FROM users
const users = await User.findAll({
attributes: ['name', 'email'],
});

31.

findAll — where
Можно задавать условия выборки через параметр where:
// SELECT * FROM users WHERE student = true
const students = await User.findAll({
where: { student: true },
});

32.

findAll — where
// SELECT * FROM users
// WHERE student=true AND status='active';
const activeStudents = await User.findAll({
where: {
student: true,
status: 'active',
},
});

33.

findAll - JOIN
По умолчанию используется LEFT OUTER
Если нужны только юзеры с Item,
JOIN - в выборку попадут ВСЕ юзеры, в
необходимо применить required: true
том числе те, у которых нет Item.
(INNER JOIN)
User.findAll({
User.findAll({
include: {
include: {
model: Item,
}
};
model: Item,
required: true,
},
});

34.

findAll — window function
Оконные функции необходимы для подсчета чего-либо без группировки GROUP BY.
Посчитает price у Items пользователя:
User.findAll({
include: {
model: Item,
required: true,
},
attributes: {
include: [
[sequelize.literal('SUM(price) OVER(PARTITION BY name)'), 'totalSpent'],
],
},
});

35.

update
Метод update() редактирует записи в таблице, подходящие по заданным
параметрам.
// UPDATE users SET name='Rauf' WHERE id=3
await User.update({ name: 'Rauf' }, { where: { id: 3 } });

36.

destroy
Метод destroy() удаляет записи, подходящие по заданным параметрам:
// DELETE user WHERE name='Igor'
await User.destroy({
where: { name: 'Igor' },
});

37.

Каскадное удаление
Операция каскадного удаления данных реализуется при помощи ключевой
фразы ON DELETE CASCADE. Чтобы реализовать каскадное удаление данных
из таблицы, нужно записать правило ON DELETE сразу после FOREIGN KEY,
тогда PostgreSQL начнет «понимать», что при удалении данных из таблиц, ей
нужно удалять и данные из связанных таблиц.

38.

Каскадное удаление
Пример для миграции:
post_id: {
type: Sequelize.INTEGER,
references: {
model: 'Posts',
key: 'id',
},
onDelete: 'CASCADE',
}
English     Русский Rules