By Okure U. Edet

Goは、比較的シンプルな構文を持つ速いプログラミング言語です。Goを学ぶ際には、APIの構築方法と、データベースとの通信に使用する方法を学ぶことが重要です。学習の過程で、その方面で助けられるプロジェクトを取り組むことにしました:簡単な在庫追跡API。

SQL database like Postgresと共に工作时,学んだのは、データベースを及时に変更することが重要であることです。したがって、将来修正可能なスキーマを持っている場合、その最好の方法はデータベースマイグレーションです。これにより、データベースの変更が既存のデータに影響を与えないように正確に行われます。

この記事では、DockerとPostgresを使用したデータベースマイグレーションについて学びます。

目次

データベースマイグレーションとは何ですか?

データベースマイグレーションとは何であり、なぜ使用する必要があるのでしょうか?バックエンド開発者として、データをデータベースに保存する必要があるプロジェクトに取り組む場合、保存したいデータのスキーマを開発する必要があります。

データベースマイグレーションは、データベース内のデータ構造を管理するためのもので、この場合、関連データベースです。マイグレーションは、現在の状態から特定の/望ましい状態にスキーマを変更するのに役立ちます。これには、テーブルや列の追加、要素の削除、型や制約の変更が含まれます。

データベースマイグレーションの一つの重要性は、データロスの心配なしにデータベースの変更を繰り返し可能でスムーズに行うことです。

最終的なデータスキーマがどのようになるかわからない場合は、マイグレーションを使用することをお勧めします。この場合、徐々に変更を実装することができます。

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のWebサイトからダウンロードできます。

Docker Desktopで、コンテナが起動したことがわかるはずです:

TablePlusを使用してデータベースに接続することができます:

接続をテストします。okと表示されていれば接続してください。Windows上で認証エラーが表示される場合、スタートメニューを開き実行をクリックします。ポップアップが開きますので、services.mscと入力してEnterを押します。postgresを探してサービスを停止します。それから再び接続を試みます。

TablePlusを使用してスキーマを作成および実行する方法

私はプロジェクトの予定されたスキーマ/モデルをdb diagramで作成しました。このtracking-inventoryはアイテム、シリアル番号、および価値を追加できるようになっています。したがって、スキーマにはitemserial_numberid、および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を您的システムにインストールすることです。このチュートリアルでは、Windows上のLinuxを使用しています。

インストールするには、このドキュメントを訪れる必要があります。

Linuxを使用しているため、curlを使用します。

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

成功してインストールされたら、TERMINALでmigrate -helpコマンドを実行して、それの various commandsを見ます。

新しいマイグレーションを作成する方法

golang-migrateをインストールした後、新しいマイグレーションスクリプトを作成することができます。

まず、TERMINALでtracking-appディレクトリの中で、codeコマンドでVS Codeを開いてください。

それを完了すると、新しいdbフォルダを作成し、dbフォルダの中にmigrationsという名前のフォルダを作成します。

そして、TERMINALで以下のコマンドを実行します。

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

ここで-extフラグは、作成したいマイグレーションの拡張子を参照します。この場合は、sqlです。-dirフラグは、ファイルを作成したいディレクトリを参照します。-seqフラグは、マイグレーションファイルの連番を参照します。

VS Code内には、updownの2つのファイルがあるはずです。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;

アイテムテーブルは最初に削除する必要があります。なぜなら、これはユーザーテーブルに参照されるからです。

Docker Postgres コンテナ内で外でデータベースを作成および削除する方法

Docker コンテナが运行しているかどうかを確認するために、以下のコマンドを使用します。

$ docker ps

しかし、そうでない場合は、docker start ${container name}コマンドを使用して起動します。

次の手順は、Linuxであれば以下のコマンドを使用してPostgresシェルにアクセスすることです。

$ docker exec -it postgres14 bin/bash

-itフラグは、インタラクティブなシェル/ターミナルを表します。このシェル内で、createdbコマンドを実行することができます。

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

作成された後、psqlコマンドを実行してデータベースとやり取りすることができます。

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

tracking_inventory=#

また、dropdbコマンドを使用してデータベースを削除することもできます。

シェルを離れるためには、exitコマンドを使用します。

Postgres コンテナの外でデータベースを作成するには、以下のコマンドを貼り付けます。

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

データベースをTablePlusで表示する方法

作成したデータベースを表示するには、先程建立した以前の接続を使用して接続します。これはルートデータベースに飛び込み、一番上のアイコンをクリックします。

作成されたデータベースが表示され、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

移行は成功しました!

データベースを更新し、新しいテーブルを見てください。

##結論

このチュートリアルで、DockerとPostgresを使用してGoでデータベース移行を无缝に書いて実行する方法を学びました。この記事から多くを学びましたことを期待してください。

私とコネクトできますtwitterまたはlinkedin上です。