Skip to content

Instantly share code, notes, and snippets.

@IagoPFerreira
Last active April 25, 2024 11:20
Show Gist options
  • Save IagoPFerreira/b0f6cd1885d9c09fb0a33c96dd0ab8ff to your computer and use it in GitHub Desktop.
Save IagoPFerreira/b0f6cd1885d9c09fb0a33c96dd0ab8ff to your computer and use it in GitHub Desktop.

Passos para a criação de uma aplicação usando o Sequelize

  1. Iniciar a aplicação
npm init -y
  1. Instalar o sequelize
npm install sequelize
  1. Instalar a CLI
npm install sequelize-cli
  1. Instalar o mysql2
npm install mysql2
  • Atalho
npm install sequelize sequelize-cli mysql2 
  1. Inicializar o Sequelize
npx sequelize-cli init
  1. Configurar o arquivo config.json gerado pelo init do CLI
// config/config.json

{
  "development": {
    "username": "root",
    "password": "",
    "database": "revisao_bloco_24",
    "host": "127.0.0.1",
    "dialect": "mysql"
  }

  // No resto do arquivo você vai encontrar as convenções para conectar o Sequelize em outros ambientes
}
  1. Usando variáves de ambiente no config.

7.1. Instale o dotenv na raiz da aplicação

npm install dotenv

7.2. Mude o nome do arquivo de config.json para config.js e exporte o objeto de configuração

// config/config.js

module.exports = {
  "development": {
    "username": "root",
    "password": "",
    "database": "revisao_bloco_24",
    "host": "127.0.0.1",
    "dialect": "mysql"
  }

  // No resto do arquivo você vai encontrar as convenções para conectar o Sequelize em outros ambientes
}

7.3. Crie um arquivo .env na raiz do projeto e adicione as variáveis de ambiente nele

<!-- .env -->

MYSQL_USER=root
MYSQL_PASSWORD=senha
MYSQL_DATABASE=database_development
MYSQL_HOSTNAME=127.0.0.1

7.4. Importe as variáves de ambiente dentro do config.js

// config/config.js

require('dotenv').config(); // Possibilita o acesso às variáveis de ambiente de dentro deste arquivo

module.exports = {
  "development": {
    "username": process.env.MYSQL_USER,
    "password": process.env.MYSQL_PASSWORD,
    "database": process.env.MYSQL_DATABASE,
    "host": process.env.MYSQL_HOSTNAME,
    "dialect": "mysql"
  }

  // No resto do arquivo você vai encontrar as convenções para conectar o Sequelize em outros ambientes
}

7.5. Alterar dentro do arquivo models/index.js de config.json para config.js

// models/index.js

// Antes
// [...]
const config = require(__dirname + '/../config/config.json')[env];
// [...]

// Depois
// [...]
const config = require(__dirname + '/../config/config.js')[env];
// [...]
  1. Criar o banco usando o CLI do Sequelize
npx sequelize db:create
  1. Criar um model
npx sequelize model:generate --name User --attributes fullName:string
  1. Alterar o model do formato de classe:
// models/user.js

'use strict';
const {
  Model
} = require('sequelize');
module.exports = (sequelize, DataTypes) => {
  class User extends Model {
    /**
     * Helper method for defining associations.
     * This method is not a part of Sequelize lifecycle.
     * The `models/index` file will call this method automatically.
     */
    static associate(models) {
      // define association here
    }
  };
  User.init({
    fullName: DataTypes.STRING
  }, {
    sequelize,
    modelName: 'User',
  });
  return User;
};

Para função:

// models/user.js

const User = (sequelize, DataTypes) => {
  const User = sequelize.define("User", {
    fullName: DataTypes.STRING,
    email: DataTypes.STRING,
  }, {
    underscored: true
  });

  return User;
};

module.exports = User;
  1. Alterar as migrations, caso seja necessário
// migrations/XXXXXXXXXXXXX-create-user.js

'use strict';
module.exports = {
  up: async (queryInterface, Sequelize) => {
    await queryInterface.createTable('Users', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      fullName: {
        type: Sequelize.STRING
      },
      email: {
        type: Sequelize.STRING
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATE
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE
      }
    });
  },
  down: async (queryInterface, Sequelize) => {
    await queryInterface.dropTable('Users');
  }
};
  1. Executar a migration
npx sequelize db:migrate

Caso queira reverter:

npx sequelize db:migrate:undo

Caso seja necessária a modificação de alguma tabela, você pode rodar um comando para gerar uma nova migration e então fazer as alterações que você precisar:

npx sequelize migration:generate --name add-column-phone-table-users
// migrations/XXXXXXXXXXXXX-add-column-XXXXXXX.js

'use strict';

module.exports = {
  up: async (queryInterface, Sequelize) => {
   await queryInterface.addColumn('Users', 'phone_num', {
     type: Sequelize.STRING,
   });
  },

  down: async (queryInterface, Sequelize) => {
    await queryInterface.removeColumn('Users', 'phone_num');
  }
};

Em seguida rodar o comando para executar a nova migration:

npx sequelize db:migrate

E alterar o model para incluit a nova coluna:

// models/user.js

const User = (sequelize, DataTypes) => {
  const User = sequelize.define("User", {
    fullName: DataTypes.STRING,
    email: DataTypes.STRING,
    phone_num: DataTypes.STRING,
  });

  return User;
};

module.exports = User;
  1. Criar um novo seed
npx sequelize seed:generate --name users
  1. Adicionar as informações que serão colocadas no banco
// seeders/XXXXXXXXXXXXX-user.js

'use strict';

module.exports = {
  up: async (queryInterface, Sequelize) => queryInterface.bulkInsert('Users',
    [
      {
        fullName: 'Leonardo',
        email: 'leo@test.com',
        phone_num: '999999999',
        createdAt: Sequelize.literal('CURRENT_TIMESTAMP'),
        updatedAt: Sequelize.literal('CURRENT_TIMESTAMP'),
      },
      {
        fullName: 'Eduardo',
        email: 'edu@test.com',
        phone_num: '888888888',
        createdAt: Sequelize.literal('CURRENT_TIMESTAMP'),
        updatedAt: Sequelize.literal('CURRENT_TIMESTAMP'),
      },
    ], {}),

  down: async (queryInterface) => queryInterface.bulkDelete('Users', null, {}),
};
  1. Executar o seed
npx sequelize db:seed:all

E para reverter:

npx sequelize db:seed:undo:all

Criar a tabela sem as colunas createdAt e updatedAt

  1. Adicionar um segundo objeto dentro do método sequelize.define() na model
// models/user.js

const User = (sequelize, DataTypes) => {
  const User = sequelize.define("User", {
    fullName: DataTypes.STRING,
    email: DataTypes.STRING,
    phone_num: DataTypes.STRING,
  }, {
    timestamps: false,
  });

  return User;
};
  1. Remover as referências das colunas na migration
// migrations/XXXXXXXXXXXXX-create-user.js

'use strict';
module.exports = {
  up: async (queryInterface, Sequelize) => {
    await queryInterface.createTable('Users', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      fullName: {
        type: Sequelize.STRING
      }
    });
  },
  down: async (queryInterface, Sequelize) => {
    await queryInterface.dropTable('Users');
  }
};
  1. Remover as referências das colunas no seeder
// seeders/XXXXXXXXXXXXX-user.js

'use strict';

module.exports = {
  up: async (queryInterface, Sequelize) => queryInterface.bulkInsert('Users',
    [
      {
        fullName: 'Leonardo',
        phone_num: '999999999',
      },
      {
        fullName: 'Eduardo',
        phone_num: '999999998',
      },
    ], {}),

  down: async (queryInterface) => queryInterface.bulkDelete('Users', null, {}),
};
@luizcalaca
Copy link

Excelente! Muito bem estruturado.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment