Por Okure U. Edet

Go é uma linguagem de programação rápida com uma sintaxe relativamente simples. Enquanto estou aprendendo Go, é importante aprender a construir APIs e a usá-las para se comunicar com bases de dados. No processo de aprendizagem, decidi assumir um projeto que me ajudou nisso: uma simples API de rastreamento de estoque.

Enquanto trabalhava com um banco de dados SQL como o Postgres, aprendi que é importante fazer alterações no banco de dados em um momento oportuno. Então, se você tem um esquema que pode ser modificado no futuro, a melhor maneira de fazer isso é com migrações de banco de dados. Isso garante que as mudanças no banco de dados sejam feitas com precisão sem afetar dados existentes.

Neste artigo, você vai aprender sobre migrações de banco de dados usando Docker e Postgres.

Conteúdo da Tabela de Conteúdos

O que é a Migração de Banco de Dados?

O que é migração de banco de dados e por que você deveria usá-la? Bem, como desenvolvedor de backend, ao trabalhar em um projeto que requer que você armazene dados em um banco de dados, você precisará desenvolver um esquema para os dados que deseja armazenar.

As migrações de banco de dados ajudam você a gerenciar a estrutura de dados dentro de um banco de dados e, neste caso, um banco de dados relacional. As migrações ajudam a modificar esquemas de um estado atual para um estado específico/desejado. Isso pode envolver a adição de tabelas e colunas, a remoção de elementos ou a alteração de tipos e restrições.

Uma importância da migração de banco de dados é fazer alterações em um banco de dados de forma repetível e sem problemas, sem a preocupação com perda de dados.

É aconselhável usar migrações se você não tiver certeza do que seu esquema final de dados ficará. Nesse sentido, você pode implementar alterações de forma incremental.

Como iniciar e executar um contêiner Docker

Abra seu terminal e crie um novo diretório mkdir tracking-inventory-app.

Em seguida, faça o download de uma imagem postgres a partir do Docker Hub. Usei a tag postgres:14-alpine. Você pode usar qualquer tag que quiser.

Em seu terminal, cole o seguinte e pressione enter:

$ docker pull postgres:14-alpine

Após a instalação, inicie o container usando o comando docker run:

$ docker run --name postgres14 -e POSTGRES_USER=root -e POSTGRES_PASSWORD=passwordd -p 5432:5432 -d postgres:14-alpine

O sinalizador --name se refere ao nome do container. O sinalizador -e se refere às variáveis de ambiente. O sinalizador -p significa publicar. Você deve executar seu container em um porto específico. O sinalizador -d significa que você quer executá-lo em modo separado.

Depois de pressionar Enter, abra seu Docker Desktop se tiver instalado. Se não tiver, pode baixá-lo do site da Docker.

No seu Docker Desktop, você deveria ver que o container foi iniciado:

Você pode estabelecer uma conexão com a base de dados usando TablePlus:

Teste a conexão. Se dizer ok, então conecte-se. Se você estiver no Windows e mostrar um erro de autenticação, vá até o botão de início e clique em Executar. Na janela que aparece, digite services.msc e pressione Enter. Procurar por postgres e clicar em Parar Serviço. Em seguida, tente se conectar novamente.

Como Criar e Executar um Esquema Usando TablePlus

Eu criei um esquema predefinido/modelo para o projeto tracking-inventory com db diagram. Este tracking-inventory deveria permitir que você adicione um item, número de série e valor. Então o esquema terá os campos item, serial_number, id e created_at.

CREATE TABLE "inventory" (
  "id" uuid PRIMARY KEY,
  "item" varchar NOT NULL,
  "serial_number" varchar NOT NULL,
  "user" uuid NOT NULL,
  "created_at" timestamptz NOT NULL DEFAULT 'now()'
);

CREATE TABLE "user" (
  "id" uuid PRIMARY KEY,
  "name" varchar NOT NULL,
  "email" varchar UNIQUE NOT NULL,
  "password" varchar NOT NULL,
  "created_at" timestamptz NOT NULL DEFAULT 'now()'
);

CREATE INDEX ON "inventory" ("item");

ALTER TABLE "inventory" ADD FOREIGN KEY ("user") REFERENCES "user" ("id");

Este é o aspecto do meu. Você pode abrir o seu TablePlus e adicionar o código PostgreSQL gerado e executá-lo.

Como instalar golang-migrate

O próximo passo é instalar golang-migrate no seu sistema. Eu estou usando Linux no Windows para este tutorial.

Para instalá-lo, visite essa documentação.

Eu estou usando Linux, portanto eu vou usar curl:

$ curl -L https://github.com/golang-migrate/migrate/releases/download/v4.12.2/migrate.linux-amd64.tar.gz | tar xvz

Uma vez instalado com sucesso, no seu terminal, execute o comando migrate -help para ver seus vários comandos.

Como criar uma nova migração

Depois de instalar golang-migrate, você pode criar um novo script de migração.

A primeira coisa, no seu terminal e dentro do diretório tracking-app, abra o VS Code com o comando code.

Uma vez feito isso, crie uma nova pasta chamada db e outra pasta dentro da pasta db chamada migrations.

Então, no seu terminal, execute o seguinte comando:

 $ migrate create -ext sql -dir db/migration -seq tracking_inventory_schema

O flag -ext se refere à extensão com que você quer que a migração seja criada. Neste caso, é sql. O flag -dir se refere ao diretório onde você quer criar os arquivos. O flag -seq se refere ao número seqüencial para os arquivos de migração.

No seu VS Code, deveriam existir dois arquivos: um para up e outro para down. O primeiro é usado para fazer mudanças para frente no diretório enquanto o segundo é para reverter as mudanças.

No arquivo up, você vai colar seu esquema para o arquivo.

Seu esquema se parece com este:

CREATE TABLE "inventory" (
  "id" uuid PRIMARY KEY,
  "item" varchar NOT NULL,
  "serial_number" varchar NOT NULL,
  "user" uuid NOT NULL,
  "created_at" timestamptz NOT NULL DEFAULT 'now()'
);

CREATE TABLE "user" (
  "id" uuid PRIMARY KEY,
  "name" varchar NOT NULL,
  "email" varchar UNIQUE NOT NULL,
  "password" varchar NOT NULL,
  "created_at" timestamptz NOT NULL DEFAULT 'now()'
);

CREATE INDEX ON "inventory" ("item");

ALTER TABLE "inventory" ADD FOREIGN KEY ("user") REFERENCES "user" ("id");

O seu pode parecer diferente dependendo do projeto que você está construindo.

Para o arquivo down, apenas cole isto:

DROP TABLE IF EXISTS inventory;
DROP TABLE IF EXISTS user;

A tabela de inventário deve ser excluída primeiro porque referencia a tabela de usuário.

Como Criar e Excluir o Banco de Dados Dentro e Fora de um Container Docker Postgres

Verifique se o seu container docker está sendo executado usando o comando:

$ docker ps

Se não estiver, use o comando docker start ${nome do container} para iniciá-lo.

O próximo passo é acessar o shell do postgres usando o seguinte comando, uma vez que estou no Linux:

$ docker exec -it postgres14 bin/bash

A bandeira -it significa shell/terminal interativo. Dentro deste shell, você pode executar o comando createdb:

/# createdb --username=root --owner=root tracking_inventory

Uma vez criado, você pode executar o comando psql para interagir com o banco de dados:

/# psql tracking-inventory
psql (14.12)
Type "help" for help.

tracking_inventory=#

Você também pode excluir o banco de dados com o comando dropdb.

Para sair do shell, use o comando exit.

Para criar o banco de dados fora do container postgres, cole o seguinte comando:

$ docker exec -it postgres14 createdb --username=root --owner=root tracking_inventory

Como Visualizar o Banco de Dados no TablePlus

Para visualizar o banco de dados que você criou, conecte-se usando a conexão anterior que nós estabelecemos anteriormente. Isso o levará ao banco de dados raiz e então clique no ícone de db no topo.

O banco de dados criado aparecerá, então basta clicar em abrir para abrir

Como Executar as Migrações

Para executar as migrações, rode este comando em seu terminal:

$ migrate -path db/migration -database "postgresql://root:passwordd@localhost:5432/tracking_inventory?sslmode=disable" -verbose up

O sinalizador -path especifica o caminho que contém os arquivos de migração. A opção -database especifica a URL para a base de dados.

No interior da URL, o driver é postgresql. O nome de usuário e a senha são respectivamente root e passwordd. Também é importante adicionar a opção sslmode=disable porque o Postgres não habilita o SSL por padrão.

Agora execute as migrações:

$ migrate -path db/migration -database "postgresql://root:passwordd@localhost:5432/tracking_inventory?sslmode=disable" -verbose up
calhost:5432/tracking_inventory?sslmode=disable" -verbose up
2024/06/25 00:13:25 Start buffering 1/u tracking_inventory_schema
2024/06/25 00:13:25 Read and execute 1/u tracking_inventory_schema
2024/06/25 00:13:26 Finished 1/u tracking_inventory_schema (read 43.186044ms, ran 255.501635ms)
2024/06/25 00:13:26 Finished after 312.928488ms
2024/06/25 00:13:26 Closing source and database

A migração foi bem-sucedida!

Atualize a base de dados e veja as novas tabelas:

##Conclusão

Throughout this tutorial, you have learnt how to seamlessly write and run database migrations in Go using Docker and Postgres. I hope you have learnt much from this article.

You can connect with me on twitter or on linkedin.