npm init -y
- инициализируем проект nodenpm i sequelize pg pg-hstore
- устанавливаем зависимости postgresnpm i -D sequelize-cli
- устанавливаем sequelize cli- создаём файл
.sequelizerc
:
const path = require('path');
module.exports = {
'config': path.resolve('config', 'config.json'),
'models-path': path.resolve('db', 'models'),
'seeders-path': path.resolve('db', 'seeders'),
'migrations-path': path.resolve('db', 'migrations')
};
npx sequelize-cli init
- создаём структуру для работы с sequelize- В файле
config.json
изменили данные для БД (username, password, database, dialect) на свои. Обратите внимание, что мы ввели разные данные для development и test - Для того, чтобы sequelize следил за сидерами (не накатывались те сидеры, которые уже были добавлены в БД, аналогично миграциям),в файл
config.json
добавили строчки
"seederStorage": "sequelize",
"seederStorageTableName": "SequelizeData"
- Создали модель командой
npx sequelize-cli model:generate --name User --attributes firstName:string,lastName:string,email:string
(изменили под себя)- Одновременно с этим создалась миграция
- Если поменяли что-то в модели - меняем и в миграции
- Накатили миграцию
npx sequelize-cli db:migrate
- Создали seeder командой
npx sequelize-cli seed:generate --name demo-user
(изменили под себя)
- Когда пишем seeder, поля
createdAt
иupdatedAt
нужно заполнить самомуnew Date()
Важно
Если в миграции вы указываете, что какое-то поле таблицы А ссылается на Таблицу В, то на момент накатывания миграции с Таблицей А, уже должна существовать Таблица В. В обратном случае, вы получите ошибку Table_name is not exist
.
-
Чтобы создать связь (один ко многим), нужно:
- в модели
Post
:
static associate(models) { this.belongsTo(models.User, { foreignKey: 'author', }); }
- в модели
User
:
static associate(models) { this.hasMany(models.Post, { foreignKey: 'author', }); }
- в миграции
create-post
:
author: { type: Sequelize.INTEGER, allowNull: false, references: { model: { tableName: 'Users', }, key: 'id', }, }
- в модели
Чтобы добвить новое поле в таблицу, нужно:
-
Создать миграцию командой
npx sequelize-cli migration:create --name new_column_in_user
-
Изменить миграцию с использованием
JavaScript queryInterface.addColumn
и
queryInterface.removeColumn
-
Добавить новое поле в модель
User
-
Запустить миграцию
npx sequelize-cli db:migrate
Для этого примера создан отдельный файл appMany.js
, и отдельная бд, которая описана в файле config.json в части test. Чтобы запустить этот файл, нужно воспользоваться скриптом npm run many
Есть три таблицы: Dogs, Cats и DogsCats. Многие собаки могут дружить с многими кошками. Связь между кошками и собаками описывается в таблице Dogscats
.
Таблица 1. Связь Many-to-Many.
-
В модели Dogs нужно описать связь с многими котами через промежуточную таблицу:
this.belongsToMany(Cat, { through: 'Dogscats', foreignKey: 'dog_id' });
-
В модели Cats нужно сделать аналогичную связь:
this.belongsToMany(Dog, { through: 'Dogscats', foreignKey: 'cat_id' });
-
В модели Dogscats ничего делать не нужно
-
В миграции
dogscats
указываем, что столбцыcat_id
иdog_id
ссылаются на таблицыCats
иDog
соответсвенноdog_id: { type: Sequelize.INTEGER, references: { model: 'Dogs', // tableName key: 'id', }, }, cat_id: { type: Sequelize.INTEGER, references: { model: 'Cats', // tableName key: 'id', }, },
-
В миграциях
Cats
иDogs
ничего делать не нужно