Skip to content

Instantly share code, notes, and snippets.

@Glaucoed
Last active February 23, 2023 18:06
Show Gist options
  • Select an option

  • Save Glaucoed/7c0265f5df5429d6219fc478ab231bdb to your computer and use it in GitHub Desktop.

Select an option

Save Glaucoed/7c0265f5df5429d6219fc478ab231bdb to your computer and use it in GitHub Desktop.
setupSequelizeORM-classe

➡️ Para começar a usar o Sequelize, é preciso iniciar uma aplicação Node.js e instalar essa biblioteca ORM utilizando os seguintes comandos:

mkdir nome-do-diretorio && cd nome-do-diretorio

➡️ Instalar dependencias

npm init -y
npm i typescript ts-node dotenv sequelize @types/sequilize
npm i -D mysql12 sequelize-cli
npx tsc --init

➡️ Apos instalar abrir o arquivo 'tsconfig.json'

"rootDir": "./src",
"outDir": "./build",

➡️ Criar arquivo .gitignore

node_modules
.env

Criar arquivo na pasta raiz .sequelizerc

const path = require('path');

module.exports = {
    'config': path.resolve(__dirname, 'build', 'database', 'config', 'database.js'),
    'models-path': path.resolve(__dirname, 'build', 'database', 'models'),
    'seeders-path': path.resolve(__dirname, 'src', 'database', 'seeders'),
    'migrations-path': path.resolve(__dirname, 'src', 'database', 'migrations'),
};

➡️ Iniciar o sequelize cli

npm sequelize-cli init

➡️ Configurar o database, criar 2 pastas dentro de src/database, chamadas de config e models.

➡️ Dentro da pasta config criar o arquivo database.ts

import { Options } from 'sequelize';
import 'dotenv/config';

const config: Options = {
  username: process.env.DB_USER || 'root',
  password: process.env.DB_PASS || 'password',
  database: 'blog-tryber',
  host: process.env.DB_HOST || 'localhost',
  port: Number(process.env.DB_PORT) || 3306,
  dialect: 'mysql',
  dialectOptions: {
    timezone: 'Z',
  },
  logging: false,
};

export = config;

➡️ Criar arquivo .env

DB_USER=root
DB_PASS=password
DB_HOST=localhost
DB_PORT=0000

➡️ Dentro do package.json crie o script:

  "scripts": {
    "db:reset": "npx -y tsc && sequelize-cli db:drop && npx sequelize-cli db:create && npx sequelize-cli db:migrate"
  },

➡️ Dentro da pasta models criar o seguinte arquivo "index.ts"

import * as config from "../config/database";
import { Sequelize } from "sequelize";

export default new Sequelize(config);

➡️ Criando uma migration

Lembrando que sempre que temos uma referencia devemos criar primeiro a tabela que não temos uma ligação entre ela.

npx sequelize-cli migration:generate --name CreateNomeDaTabela

ou

npx sequelize-cli model:create --name CreateNomeDaTabela --attributes title:string,content:string

➡️ No arquivo CreateNomeDaTabela.js

'use strict';

module.exports = {
  async up (queryInterface, Sequelize) {
   await queryInterface.createTable('posts', {
    id: {
      allowNull: false,
      autoIncrement: true,
      primaryKey: true,
      type: Sequelize.INTEGER,
    },
    title: {
      allowNull: false,
      type: Sequelize.STRING,
    },
    content: {
      allowNull: false,
      type: Sequelize.STRING,
     ==================== Para referencias ====================
      references: {
          model: 'posts',
          key: 'id',
        },
        field: 'post_id',
      ===========================================================
    }
   })
  },

  async down (queryInterface, _Sequelize) {
    await queryInterface.dropTable('posts')
  }
};

➡️ Para executar as migrations executar o sequinte comando

npx sequelize-cli db:migrate

➡️ Criar arquino dentro da pasta models

ExemploModel.ts

➡️ Configurações do arquivo ExemploModel.ts

  • Precisamos definir o que estamos utilizando na nossa model, no id utilizamos o readonly por ser autoincrement
  • O db é a instancia que vamos criar do banco de dados, o arquivo index.ts
  • modelName é o mesmo nome que utilizamos na migration exemplo: comments - await queryInterface.createTable('comments', {})
  • No final é feito as associações.
import { Model, INTEGER, STRING } from 'sequelize';
import db from './index';
import Post from './PostModel';

class Comment extends Model {
  declare readonly id: number;
  declare content: string;
  declare postId: number
};

Comment.init({
  id: {
    allowNull: false,
    autoIncrement: true,
    primaryKey: true,
    type: INTEGER,
  },
  content: {
    allowNull: false,
    type: STRING,
  },
  postId: {
    allowNull: false,
    type: INTEGER,
  }

  }, {
  sequelize: db,
  underscored: true,
  timestamps: false,
  modelName: 'comments',
});

  Comment.belongsTo(Post, { foreignKey: 'post_id', as: 'id_post'});
  Post.hasMany(Comment, { foreignKey: 'post_id', as: 'id_post'});

export default Comment;

Até aqui foi configurado.

Proximo passo é criar o diretorio de interfaces - o ideal é criar um diretorio para api para que tudo fique separado (exemplo: src/api/interfaces)

  • É necessario ter uma interface para cada model
  • Uma interface para o service que é o crud

Interface IPost

export default interface IPost {
  id?: number;
  title: string;
  content: string;
}

Interface IServicePost

  • O é a model que criamos, ele é considerado o modelo que vai ser retornado, por isso utilizamos o Promise
import Post from "../../database/models/PostModel";
import IPost from "./IPost";

export default interface IServicePost {
  create(dto: IPost): Promise<Post>
}

Agora criamos o diretorio services e o arquivo:

ExemploService.ts    

Dentro do arquivo criamos da seguinte forma e aparecerá um erro que não foi implementado

import IServicePost from "../interfaces/IServicePost";

export default class PostService implements IServicePost{
  
}
  • Clicamos passamos o mouse sobre o PostService --> Quick Fix --> Implemenct e ficará da seguinte forma:
export default class PostService implements IServicePost{
  create(dto: IPost): Promise<Post> {
    throw new Error("Method not implemented.");
  }
  
}

Proximo passo é implementar o TDD

Após realizar o TDD, vamos realizar a implementação do metodo

export default class PostService implements IServicePost{
  create(dto: IPost): Promise<Post> {
    return this.model.create(dto);
  }
  
}


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