Essa postagem tem como objetivo apresentar como criar migrations em aplicações NodeJs, para a criação vamos usar o ORM TypeORM.
ORM(Object Relational Mapper): é uma técnica de mapeamento objeto relacional que permite fazer uma relação dos objetos com os dados que os mesmos representam;
TypeORM é um ORM que pode ser executado em plataforma NodeJs, Browser, React Native, TypeScript, JavaScript entre outros, no nosso exemplo vamos configurar um projeto para poder usá-lo para criar e interagir com dados das tabelas;
1 – Adicionar pacotes
Com o projeto já criado vamos começar a adicionar os pacotes necessários, execute os comandos a seguir:
a) TypeORM
yarn add typeorm
yarn add reflect-metadata
b) Postgres
yarn add pg
c) ts-node
yarn add -D ts-node-dev
yarn add -D tsconfig-paths
2 – Script Package
Para executar o comando typeorm vamos criar o trecho do script, adicione o trecho de código no package.json:
"scripts": {
"dev:server": "ts-node-dev -r tsconfig-paths/register --inspect --transpile-only --ignore-watch node_modules src/server.ts",
"start": "ts-node src/server.ts",
"typeorm": "ts-node-dev -r tsconfig-paths/register ./node_modules/typeorm/cli.js"
},
3 – Configuração ORM
Para poder criar e acessar a base de dados temos que criar as configurações, para isso crie na raiz do projeto o arquivo ormconfig.json.
No arquivo ormconfig.json coloque o código abaixo:
[{
"name": "default",
"type": "postgres",
"host": "localhost",
"port": 5432,
"username": "postgres",
"password": "docker",
"database": "baseOrm",
"entities": ["./src/models/**/*.ts"],
"migrations": ["./src/migrations/*.ts"],
"cli": {
"migrationsDir": "./src/migrations/"
}
}]
- type: Tipo de base de dados que pode ser: mysql, postgres, cockroachdb, mariadb, sqlite, better-sqlite3, cordova, nativescript, oracle, mssql, mongodb, sqljs, react-native;
- host: Se for usar acesso a banco de dados remoto ou uma VM, utilize o IP;
- port: porta de acesso ao banco de dados;
- username: usuário com acesso ao banco de dados;
- password: senha de acesso ao banco de dados;
- database: nome da base de dados;
- entities: local onde vamos criar nossas entidades, essas entidades são as que vamos mapear;
- migrations: informa o local onde nossas migrations são carregadas;
- migrationsDir: local onde as migrations devem ser criada pelo CLI;
4 – Entidades
Para exemplificar vou criar duas entidades com relacionamento one-to-one são elas: Profile e User.
a) profile.ts
import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";
@Entity("profiles")
export default class Profile {
@PrimaryGeneratedColumn("uuid")
id: string;
@Column()
gender: string;
@Column()
photo: string;
}
b) user.ts
import {
Entity,
PrimaryGeneratedColumn,
Column,
OneToOne,
JoinColumn
} from "typeorm";
import Profile from "./profile";
@Entity("users")
export default class User {
@PrimaryGeneratedColumn("uuid")
id: string;
@Column()
name: string;
@Column()
profile_id: string;
@OneToOne(type => Profile)
@JoinColumn({ name: "profile_id" })
profile: Profile;
}
Como pode ser observado temos duas entidades: user.ts que possui profile.ts.
5 – TypeORM CLI
Depois de adicionar os pacotes, configuração os dados de acesso ao banco de dados e criar nossas entidades agora é hora de executar o comando para criar as tabelas.
a) Criar migrations
yarn typeorm migration:create -n CreateProfile
yarn typeorm migration:create -n CreateUser
6 – Migrations
Após executar o passo acima será criados as migrations, temos que adicionar os códigos que vão criar as tabelas, segue abaixo:
a) Migration Profile
import { MigrationInterface, QueryRunner, Table } from "typeorm";
export default class CreateProfile1600016576988 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.createTable(
new Table({
name: "profiles",
columns: [
{
name: "id",
type: "uuid",
isPrimary: true,
generationStrategy: "uuid",
default: "uuid_generate_v4()"
},
{
name: "gender",
type: "varchar(200)"
},
{
name: "photo",
type: "varchar(200)"
}
]
})
);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.dropTable("profiles");
}
}
b) Migration User
import { MigrationInterface, QueryRunner, Table } from "typeorm";
export default class CreateUser1600016590838 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.createTable(
new Table({
name: "users",
columns: [
{
name: "id",
type: "uuid",
isPrimary: true,
generationStrategy: "uuid",
default: "uuid_generate_v4()"
},
{
name: "name",
type: "varchar(200)"
},
{
name: "profile_id",
type: "uuid"
}
],
foreignKeys: [
{
name: "providerUser",
referencedTableName: "profiles",
referencedColumnNames: ["id"],
columnNames: ["profile_id"],
onDelete: "CASCADE",
onUpdate: "CASCADE"
}
]
})
);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.dropTable("users");
}
}
Após criar as migrations vamos executar o comando para rodar as migrations e criar as tabelas:
yarn typeorm migration:run
Se tudo ocorre sem erro será criado as tabelas na base de dados igual segue a imagem abaixo:
Caso queira reverter a criação das tabelas pode ser executado o comando:
yarn typeorm migration:revert
Top comments (1)
Hahaha mexendo no smile hoje, tentando buscar uma forma de executar uma migration em dev e me deparo com esse post. Muito bom!