By Okure U. Edet
Go é uma linguagem de programação rápida com uma sintaxe relativamente simples. Ao aprender Go, é importante saber como construir APIs e como usá-las para se comunicar com bancos de dados. No processo de aprendizagem, decidi me envolver em um projeto que me ajudou nesse sentido: uma API simples de rastreamento de inventário.
Enquanto trabalho com um banco de dados SQL como o Postgres, aprendi que é importante fazer mudanças no banco de dados em tempo hábil. Portanto, se você tem um esquema que pode modificar no futuro, a melhor forma de fazer isso é usando migrações de banco de dados. Isso garante que as alterações no banco de dados sejam feitas com precisão sem afetar os dados existentes.
Neste artigo, você aprenderá sobre migrações de banco de dados usando Docker e Postgres.
Sumário
- O que é Migração de Banco de Dados?
- Como Iniciar e Executar um Container Docker
- Como Criar e Executar um Esquema Usando TablePlus
- Como Instalar golang-migrate
- Como Criar uma Nova Migração
- Como Criar e Excluir um Banco de Dados Dentro e Fora de um Container Docker Postgres
- Como Visualizar a Base de Dados no TablePlus
- Como Executar as Migrações
- Conclusão
O que é Migração de Banco de Dados?
O que é migração de banco de dados e por que você deveria usá-la? Bem, como desenvolvedor backend, quando trabalhando em um projeto que exige que você armazene dados em um banco de dados, você precisará desenvolver um esquema para os dados que você quer armazenar.
Migrações de banco de dados ajudam você a gerenciar a estrutura de dados dentro de um banco de dados, neste caso, um banco de dados relacional. 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 mudança de tipos e constraints.
Uma importância das migrações de banco de dados é tornar as mudanças no banco de dados reprodutíveis e sem problemas, sem a preocupação de perda de dados.
É recomendável usar migrações se você não tiver certeza do que seu esquema de dados final parecerá. Neste sentido, você pode implementar mudanças incrementais nele.
Como Iniciar e Executar um Container Docker
Abra seu terminal e crie um novo diretório mkdir tracking-inventory-app
.
Em seguida, puxe uma imagem do postgres do Docker Hub. Eu usei a tag postgres:14-alpine
. Você pode usar qualquer tag que quiser.
No seu terminal, cole o seguinte e pressione Enter:
$ docker pull postgres:14-alpine
Ao instalar, inicie o contêiner usando o comando docker run
$ docker run --name postgres14 -e POSTGRES_USER=root -e POSTGRES_PASSWORD=passwordd -p 5432:5432 -d postgres:14-alpine
A bandeira --name
se refere ao nome do contêiner. A bandeira -e
se refere às variáveis de ambiente. A bandeira -p
significa publicar. Você deve executar seu contêiner em uma porta especificada. A bandeira -d
significa que você quer executá-lo em modo desanexado.
Após pressionar Enter, abra seu Docker Desktop se você tiver ele instalado. Se não, você pode baixá-lo no site do Docker.
Em seu Docker Desktop, você deve ver que o contêiner foi iniciado:
Você pode estabelecer uma conexão com o banco de dados usando o TablePlus:
Teste a conexão. Se ele diz ok, então conecte. Se você estiver no Windows e aparecer um erro de autenticação, vá até o botão Iniciar e clique em Executar
. Na janela que aparecer, digite services.msc
e pressione Enter. Procure pelo postgres e clique em parar o serviço. Depois tente conectar novamente.
Como Criar e Executar um Esquema Usando o TablePlus
Eu criei um esquema/modelo pré-definido para o projeto de rastreamento-de-inventário com diagrama de db. Esse rastreamento-de-inventário deve permitir que você adicione um item, número de série e valor. Então o esquema terá 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");
É assim que o meu parece. Você pode abrir o TablePlus e adicionar o código PostgreSQL gerado e executá-lo.
Como Instalar o golang-migrate
O próximo passo é instalar o golang-migrate
em seu sistema. Eu estou usando Linux no Windows para este tutorial.
Para instalá-lo, visite esta documentação.
Estou usando Linux, então 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 os vários comandos.
Como Criar uma Nova Migração
Após instalar o golang-migrate
, você pode criar um novo script de migração.
Primeiro, no seu terminal e dentro do diretório de tracking-app, abra o VS code com o comando code
.
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
A bandeira -ext
se refere à extensão que você deseja que a migração seja criada. Neste caso, é sql. A bandeira -dir
se refere ao diretório em que você deseja criar os arquivos. A bandeira -seq
se refere ao número sequencial para os arquivos de migração.
Dentro do seu VS code, deveria haver dois arquivos: um para up
e outro para down
. O primeiro é usado para fazer alterações diretas no diretório, enquanto o último é para reverter as alterações.
No arquivo up
, você vai colar seu esquema no arquivo.
Seu esquema 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
, basta colar isto:
DROP TABLE IF EXISTS inventory;
DROP TABLE IF EXISTS user;
A tabela de inventário deve ser excluída primeiro porque faz referência à tabela de usuários.
Como Criar e Excluir o Banco de Dados Dentro e Fora de um Container Docker Postgres
Verifique se seu container docker está executando 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, já que estou no Linux:
$ docker exec -it postgres14 bin/bash
O sinalizador -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 db:
/# 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 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
A bandeira -path
especifica o caminho que contém os arquivos de migração. A opção -database
especifica a url para o banco de dados.
Dentro da url, o driver é postgresql
. O nome de usuário e a senha são root
e passwordd
respectivamente. Também é importante adicionar a opção sslmode=disable
porque o Postgres não habilita 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 o banco de dados e veja as novas tabelas:
##Conclusão
Throughout este tutorial, você aprendeu como escrever e executar migrações de banco de dados em Go usando Docker e Postgres. Espero que você tenha aprendido muito com este artigo.
Source:
https://www.freecodecamp.org/news/how-to-create-database-migrations-in-go/