Code Monkey home page Code Monkey logo

sequelize_intro's Introduction

Sequelize intro

Как начинали работу

  1. npm init -y - инициализируем проект node
  2. npm i sequelize pg pg-hstore - устанавливаем зависимости postgres
  3. npm i -D sequelize-cli - устанавливаем sequelize cli
  4. создаём файл .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')
 };
  1. npx sequelize-cli init - создаём структуру для работы с sequelize
  2. В файле config.json изменили данные для БД (username, password, database, dialect) на свои. Обратите внимание, что мы ввели разные данные для development и test
  3. Для того, чтобы sequelize следил за сидерами (не накатывались те сидеры, которые уже были добавлены в БД, аналогично миграциям),в файл config.json добавили строчки
    "seederStorage": "sequelize",
    "seederStorageTableName": "SequelizeData"

Что сделали

  1. Создали модель командой npx sequelize-cli model:generate --name User --attributes firstName:string,lastName:string,email:string (изменили под себя)
    • Одновременно с этим создалась миграция
    • Если поменяли что-то в модели - меняем и в миграции
  2. Накатили миграцию npx sequelize-cli db:migrate
  3. Создали seeder командой npx sequelize-cli seed:generate --name demo-user (изменили под себя)

На что обратить внимание

  1. Когда пишем seeder, поля createdAt и updatedAt нужно заполнить самому new Date()

Связи

Важно

Если в миграции вы указываете, что какое-то поле таблицы А ссылается на Таблицу В, то на момент накатывания миграции с Таблицей А, уже должна существовать Таблица В. В обратном случае, вы получите ошибку Table_name is not exist.

One-to-Many relation
Таблица 1. Связь One-to-Many.

  1. Чтобы создать связь (один ко многим), нужно:

    • в модели 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',
          },
          }

Миграции

Чтобы добвить новое поле в таблицу, нужно:

  1. Создать миграцию командой npx sequelize-cli migration:create --name new_column_in_user

  2. Изменить миграцию с использованием

    JavaScript queryInterface.addColumn

    и

    queryInterface.removeColumn

  3. Добавить новое поле в модель User

  4. Запустить миграцию npx sequelize-cli db:migrate

Many to many

Для этого примера создан отдельный файл appMany.js, и отдельная бд, которая описана в файле config.json в части test. Чтобы запустить этот файл, нужно воспользоваться скриптом npm run many

Идея

Есть три таблицы: Dogs, Cats и DogsCats. Многие собаки могут дружить с многими кошками. Связь между кошками и собаками описывается в таблице Dogscats.

Many-to-Many relation
Таблица 1. Связь Many-to-Many.

Модели

  1. В модели Dogs нужно описать связь с многими котами через промежуточную таблицу:

    this.belongsToMany(Cat, { through: 'Dogscats', foreignKey: 'dog_id' });
  2. В модели Cats нужно сделать аналогичную связь:

      this.belongsToMany(Dog, { through: 'Dogscats', foreignKey: 'cat_id' });
  3. В модели Dogscats ничего делать не нужно

Миграции

  1. В миграции 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',
        },
        },
  2. В миграциях Cats и Dogs ничего делать не нужно

sequelize_intro's People

Contributors

jtarasova avatar

Stargazers

Roman avatar Aleks avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.