Похожие презентации:
Sequelize CLI models migrations
1.
фаза 1 · неделя 3 · день 2Sequelize CLI
models
migrations
2.
План1. Sequelize CLI
2. Модели
3. Миграции
4. Методы моделей
5. Каскадное удаление
3.
Sequelize CLI4.
Sequelize CLICLI (command line interface) — интерфейс командной строки.
Sequelize CLI — программа для работы с Sequelize ORM из терминала.
npm i -D sequelize-cli
npx sequelize init
5.
Sequelize CLISequelize CLI создаёт 4 директории в корневой папке:
● config/
● models/
● migrations/
● seeders/
6.
Sequelize CLIconfig/
config.json
Реквизиты подключения к БД — имя и пароль пользователя БД, название
базы, хост, порт, etc.
models/
index.js — само подключение к базе данных.
+ модели для работы с БД.
7.
Sequelize CLImigrations/
Миграции для изменения структуры БД.
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',
}