By Okure U. Edet
Go – это быстрорастущий язык программирования с довольно простым синтаксисом. Во время изучения языка Go важно научиться строить API и уметь ими взаимодействовать с базами данных. Во время процесса обучения я решил взяться за проект, который помог мне в этом: простая система отслеживания запасов API.
Работая с SQL-базой данных, как например, Postgres, я узнал, что важно производить изменения в базе данных временно. Так что если у вас есть схема, которую можно будет изменить в будущем, лучшим способом сделать это является использование базовых миграций. Это保证了 база данных изменено корректно, не затрагивая существующие данные.
В этой статье вы узнаете о базовых миграциях с использованием Docker и Postgres.
Contents
- Что такое базовая миграция?
- Как запустить и работать с контейнером Docker
- Как создать и запустить схему с использованием TablePlus
- Как установить golang-migrate
- Как создать новую миграцию
- Как создать и удалить базу данных внутри и вне контейнера Postgres Docker
- Как просмотреть базу данных в TablePlus
- Как запустить миграции
- Заключение
Что такое миграция базы данных?
Что такое миграция базы данных и зачем ее использовать? Да, как разработчик 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. Я надеюсь, что вы многое узнали из этой статьи.
Source:
https://www.freecodecamp.org/news/how-to-create-database-migrations-in-go/