Repositório que é um checklist para uso do Sequelize desde a instalação até a configuração de um Model.
NPM ou Yarn para instalação, inicialização e gerenciamento do sequelize.
Comando se você usa NPM:
npm i sequelize
npm i sequelize-cli -D
Comando se você usa Yarn:
yarn add sequelize
yarn add sequelize-cli -D
Instale também o módulo referente ao banco que for utilizar junto ao sequelize. Como por exemplo pg para postgres ou mysql2 para mysql. Para isso o comando no caso de uso do postgres seria:
npm i pg
Para iniciar o sequelize, vamos usar comandos de execução que se você usa NPM será nxp, e se você usar Yarn, será o próprio yarn.
npx sequelize init
ou
yarn sequelize init
Nesse ponto é possível reorganizar as pastas como queira. Após isso, será preciso criar o arquivo .sequelizerc na raiz de seu projeto para definir o caminho correto das pastas.
Use o módulo path com o método resolve para informar ao sequelize as disposição das pastas em seu projeto. Neste repositório tem a pasta src e o arquivo .sequelizerc para exemplificar melhor.
const path = require("path");
module.exports = {
config: path.resolve("src", "config", "database.js"),
"models-path": path.resolve("src", "app", "models"),
"seeders-path": path.resolve("src", "database", "seeders"),
"migrations-path": path.resolve("src", "database", "migrations"),
};
Dentro da pasta "config", o arquivo em formado .json estará por padrão com 3 ambientes a ser configurados. Mas vamos iniciar apenas com 1 ambiente e no formato .js já que vamos precisar importar variáveis de ambiente para deixar nossa configuração mais dinâmica.
Atenção para informar corretamente os dados de seu banco, como host, user, password, database e o dialeto, que no exemplo abaixo é postgres.
module.exports = {
host: "127.0.0.1",
username: "myuser",
password: "mypassword",
database: "mydatabase",
dialect: "postgres",
operatorsAliases: false,
logging: false,
define: {
timestamps: true,
unserscored: true,
unserscoredAll: true,
},
};
Que é um controle de versão no nosso banco de dados referente a dados específicos, como no exemplo a seguir, "users". Evitando problemas de gerenciamento de dados desatualizados pelo uso de mais de 1 desenvolvedor.
npx sequelize migration:create --name=users-create
ou
yarn sequelize migration:create --name=users-create
Depois de criada, vamos configurar:
"use strict";
module.exports = {
async up(queryInterface, Sequelize) {
// cria a tabela com o nome "users"
return queryInterface.createTable("users", {
id: {
type: Sequelize.INTEGER, // tipo
primaryKey: true, // chave primária
autoIncrement: true, // auto-incrementável
allowNull: false, // campo obrigatório
},
name: {
type: Sequelize.STRING,
allowNull: false,
},
email: {
type: Sequelize.STRING,
unique: true, // Valor não pode se repetir
allowNull: false,
},
password_hash: {
// senha incriptada
type: Sequelize.STRING,
allowNull: false,
},
created_at: {
// data de criação
type: Sequelize.DATE,
allowNull: false,
},
updated_at: {
// data de atualização
type: Sequelize.DATE,
allowNull: false,
},
});
},
// dropa (deleta) a tabela
async down(queryInterface, Sequelize) {
queryInterface.dropTable("users");
},
};
Agora podemos executar a tabela com o comando:
npx sequelize db:migrate
ou
yarn sequelize db:migrate
Na pasta "models", crie o arquivo "User.js" e crie a função de definição de tipos de dados referente a tabela de usuário.
module.exports = (sequelize, DataTypes) => {
const User = sequelize.define("User", {
name: DataTypes.STRING,
email: DataTypes.STRING,
password_hash: DataTypes.STRING,
});
return User;
};
Como mudamos o arquivo de configuração para .js para receber variáveis de ambiente posteriormente, vamos precisar fazer algumas alterações no arquivo index da pasta model. Isso porque o tal arquivo index, serve para fazer com que os models que criarmos dentro da pasta models, fiquem disponíveis para o sequelize.
const env = process.env.NODE_ENV || "development";
Na nova linha 7, remova o dirname, o array de env e aponte agora o caminho para o arquivo na pasta config:
Antes:
const config = require(__dirname + "/../config/config.json")[env];
Depois:
const config = require("../../config/database");
No código da linha 10 à 20. Vamos remover a condição IF deixando apenas o resultado de condição verdadeira armazenado em uma const. Além disso, vamos passar ao sequelize os parâmetros de forma diferente.
Antes:
let sequelize;
if (config.use_env_variable) {
sequelize = new Sequelize(process.env[config.use_env_variable], config);
} else {
sequelize = new Sequelize(
config.database,
config.username,
config.password,
config
);
}
Depois:
const sequelize = new Sequelize(
config.database,
config.username,
config.password,
config
);
const routes = require("express").Router();
const { User } = require("./app/models");
User.create({
name: "Adriano",
email: "[email protected]",
password_hash: "12345678910",
});
module.exports = routes;