➡️ 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
npm init -y
npm i typescript ts-node dotenv sequelize @types/sequilize
npm i -D mysql12 sequelize-cli
npx tsc --init
"rootDir": "./src",
"outDir": "./build",
node_modules
.env
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'),
};
npm sequelize-cli init
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;
DB_USER=root
DB_PASS=password
DB_HOST=localhost
DB_PORT=0000
"scripts": {
"db:reset": "npx -y tsc && sequelize-cli db:drop && npx sequelize-cli db:create && npx sequelize-cli db:migrate"
},
import * as config from "../config/database";
import { Sequelize } from "sequelize";
export default new Sequelize(config);
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
'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')
}
};
npx sequelize-cli db:migrate
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;
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
export default interface IPost {
id?: number;
title: string;
content: string;
}
- 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>
}
ExemploService.ts
import IServicePost from "../interfaces/IServicePost";
export default class PostService implements IServicePost{
}
- Clicamos passamos o mouse sobre o
PostService-->Quick Fix-->Implemencte ficará da seguinte forma:
export default class PostService implements IServicePost{
create(dto: IPost): Promise<Post> {
throw new Error("Method not implemented.");
}
}
export default class PostService implements IServicePost{
create(dto: IPost): Promise<Post> {
return this.model.create(dto);
}
}