By Okure U. Edet

Go – это быстрорастущий язык программирования с довольно простым синтаксисом. Во время изучения языка Go важно научиться строить API и уметь ими взаимодействовать с базами данных. Во время процесса обучения я решил взяться за проект, который помог мне в этом: простая система отслеживания запасов API.

Работая с SQL-базой данных, как например, Postgres, я узнал, что важно производить изменения в базе данных временно. Так что если у вас есть схема, которую можно будет изменить в будущем, лучшим способом сделать это является использование базовых миграций. Это保证了 база данных изменено корректно, не затрагивая существующие данные.

В этой статье вы узнаете о базовых миграциях с использованием Docker и Postgres.

Contents

Что такое миграция базы данных?

Что такое миграция базы данных и зачем ее использовать? Да, как разработчик backend, работая над проектом, который требует хранения данных в базе данных, вам потребуется разработать схему для данных, которые вы хотите хранить.

Миграции базы данных помогают вам управлять структурой данных внутри базы данных и, в данном случае, реляционной базы данных. Миграции помогают изменять схемы из текущего состояния в определенное/желаемое состояние. Это может включать добавление таблиц и столбцов, удаление элементов или изменение типов и ограничений.

Одна из важных особенностей миграции базы данных состоит в том, что она позволяет вносить изменения в базу данных повторяемо и безупречно, не опасаясь потери данных.

Рекомендуется использовать миграции, если вы не уверены в том, каким будет ваша окончательная схема данных. Таким образом, вы можете постепенно внедрять изменения.

Как запустить и выполнить контейнер Docker

Откройте вашу терминальную консоль и создайте новую директорию mkdir tracking-inventory-app.

Затем из Docker Hub вытяните изображение postgres. Я использовал тег postgres:14-alpine. Можно использовать любой другой тег.

В вашей терминальной консоли вставьте следующий код и нажмите Enter:

$ docker pull postgres:14-alpine

После установки вы можете запустить контейнер с помощью команды docker run:

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

Флаг --name означает имя контейнера. Флаг -e содержит переменные среды. Флаг -p意味着发布。您应该在指定端口上运行您的容器。Флаг -d意味着您想要在分离模式下运行。

Нажмите Enter, а затем откройте Docker Desktop, если у вас установлен. Если нет, вы можете скачать его с сайта Docker.

В Docker Desktop вы должны увидеть, что контейнер был запущен:

Вы можете установить соединение с базой данных с помощью TablePlus:

Проверьте соединение. Если оно говорит оК, соединитесь. Если вы на Windows и появляется ошибка аутентификации, перейдите к кнопке Start и нажмите на Run. В появившемся окне введите services.msc и нажмите Enter. Ищите postgres и нажмите на остановить службу. Затем попробуйте соединиться снова.

Как создавать и запускать схему с помощью TablePlus

Я создал предварительно определенную схему/модель для проекта tracking-inventory с db diagram. Эта tracking-inventory должна позволить вам добавлять элемент, номер серий и стоимость. Таким образом, схема будет содержать поля item, serial_number, id и 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");

Вот так выглядит моя. Вы можете открыть TablePlus и добавить сгенерированный код PostgreSQL и запустить его.

Установка golang-migrate

Следующим шагом является установка golang-migrate на вашу систему. Я использую Linux на Windows для этого урока.

Чтобы установить его, посетите эту документацию.

Я использую Linux, поэтому воспользуюсь curl:

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

После успешной установки в терминале запустите команду migrate -help, чтобы просмотреть различные команды.

Как создать новую миграцию

После установки golang-migrate вы можете создать новый сценарий миграции.

Сначала, в вашем терминале и в директории tracking-app, откройте VS code с помощью команды code.

После этого создайте новую папку с именем db и другую папку внутри папки db с именем migrations.

Затем в терминале запустите следующую команду:

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

Флаг -ext указывает на расширение, с которым вы хотите создать миграцию. В этом случае, это sql. Флаг -dir указывает на директорию, в которой вы хотите создавать файлы. Флаг -seq указывает на последовательный номер для файлов миграции.

Внутри вашего VS code должны быть два файла: один для up и другой для down. Первый используется для внесения изменений вперед, а второй для отмены изменений.

В файле up вам нужно вставить вашу схему.

Мой схема выглядит следующим образом:

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");

Ваша может быть иной, в зависимости от проекта, который вы строите.

Для файла down просто вставьте следующее:

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

Первым должен быть удален справочник, поскольку он ссылается на таблицу пользователей.

Как создавать и удалять базу данных внутри и вне контейнера Postgres Docker

Проверьте, запущен ли ваш контейнер Docker, используя команду:

$ docker ps

Если нет, используйте команду docker start ${container name}, чтобы запустить его.

下一步是使用以下命令访问Postgres shell,因为我正在使用Linux:

$ docker exec -it postgres14 bin/bash

Flag -it означает интерактивную оболочку/терминал. Внутри этой оболочки вы можете выполнять команду createdb:

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

一旦创建完成,您可以运行psql命令与数据库交互:

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

tracking_inventory=#

您还可以使用dropdb命令删除数据库。

要退出shell,请使用exit命令。

在postgres容器外部创建数据库,请粘贴以下命令:

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

如何在TablePlus中查看数据库

要查看您创建的数据库,请使用我们之前建立的连接连接。这将带您到根数据库,然后单击顶部的db图标。

创建的数据库将出现,然后只需单击open以打开它

如何运行迁移

要在终端中运行迁移,请运行以下命令:

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

Заголовок -path указывает путь, содержащий файлы миграции. Опция -database указывает URL базы данных.

Внутри URL драйвером является postgresql. Имя пользователя и пароль соответственно root и passwordd. Также важно добавить опцию sslmode=disable, потому что Postgres по умолчанию не включает SSL.

Теперь запустите миграции:

$ 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

Миграция успешна!

Обновите базу данных и посмотрите на новые таблицы:

##Заключение

За время этого руководства вы научились гладко писать и запускать миграции базы данных на Go, используя Docker и Postgres. Я надеюсь, что вы многое узнали из этой статьи.

Вы можете связаться со мной в twitter или на linkedin.