Migrations

Migrations (ou migrações) são um mecanismo para versionar e gerenciar mudanças na estrutura do banco de dados de forma organizada e controlada. O termo Dry-run é usado para simulações de migração, enquanto live-run é usado para realmente efetuar migrações contra o banco.


node-pg-migrate

O node-pg-migrate é uma biblioteca para gerenciar migrações em bancos de dados PostgreSQL usando Node.js. Ele permite criar, modificar e reverter mudanças no banco de dados de forma organizada e versionada, sem precisar escrever SQL manualmente. A propriedade dryRun no node-pg-migrate é usada para simular a execução das migrações sem realmente aplicá-las no banco de dados.

Instalar node-pg-migrate

bash
$ npm install node-pg-migrate@6.2.2
script_package_migrations.json
"scripts": {
    "migration:create": "node-pg-migrate --migration-dir infra/migrations create", // pode ser apenas -m
    "migration:up": "node-pg-migrate -m infra/migrations --envPath .env.development up"
  },

Script para ser inserido no arquivo package.json. infra/migrations é o diretório que foi definido manualmente para salvar as migrações. --envPath aponta aonde está o arquivo de conexão .env, onde será lido a variável DATABSE_URL do arquivo para conexão com o banco (modulo dotenv precisa estar instalado).

O nome dos arquivos criados tem um unix timestamp (numero único do momento da criação) para ordenar a execução dos arquivos.  Na primeira migração executada (up), será criada uma tabela para pelo proprio módulo para controlar as migrações.

Comandos migração

Leve em consideração os scripts criados no package.json. Antes de subir as alterações suba o banco e conect o node-pg-migrate ao postgres (podendo ser atravez do arquivo .env)

bash
$ npm run migration:create nome_migracao # Cria uma nova migração, incluindo a criação de uma pasta para as migrations
$ npm run migration:up # Executa as migrações presentes no UP do arquivo de migration contra o DB
arquivo_migration.js
/* eslint-disable camelcase */

exports.shorthands = undefined;

exports.up = pgm => {}; // Onde se colocam as alterações

exports.down = pgm => {}; // Onde se desfazem as alterações