By Okure U. Edet
Goは、比較的シンプルな構文を持つ速いプログラミング言語です。Goを学ぶ際には、APIの構築方法と、データベースとの通信に使用する方法を学ぶことが重要です。学習の過程で、その方面で助けられるプロジェクトを取り組むことにしました:簡単な在庫追跡API。
SQL database like Postgresと共に工作时,学んだのは、データベースを及时に変更することが重要であることです。したがって、将来修正可能なスキーマを持っている場合、その最好の方法はデータベースマイグレーションです。これにより、データベースの変更が既存のデータに影響を与えないように正確に行われます。
この記事では、DockerとPostgresを使用したデータベースマイグレーションについて学びます。
目次
- データベースマイグレーションとは何でしょう?
- Dockerコンテナの開始と実行方法
- TablePlusを使用したスキーマの作成と実行方法
- golang-migrateのインストール方法
- 新しいマイグレーションの作成方法
- Docker Postgresコンテナ内および外部でデータベースを作成および削除する方法
- TablePlus でデータベースを見る方法
- マイグレーションの実行方法
- 結論
データベースマイグレーションとは何ですか?
データベースマイグレーションとは何であり、なぜ使用する必要があるのでしょうか?バックエンド開発者として、データをデータベースに保存する必要があるプロジェクトに取り組む場合、保存したいデータのスキーマを開発する必要があります。
データベースマイグレーションは、データベース内のデータ構造を管理するためのもので、この場合、関連データベースです。マイグレーションは、現在の状態から特定の/望ましい状態にスキーマを変更するのに役立ちます。これには、テーブルや列の追加、要素の削除、型や制約の変更が含まれます。
データベースマイグレーションの一つの重要性は、データロスの心配なしにデータベースの変更を繰り返し可能でスムーズに行うことです。
最終的なデータスキーマがどのようになるかわからない場合は、マイグレーションを使用することをお勧めします。この場合、徐々に変更を実装することができます。
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を使用してスキーマを作成および実行する方法
私は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を您的システムにインストールすることです。このチュートリアルでは、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内には、up
とdown
の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でデータベース移行を无缝に書いて実行する方法を学びました。この記事から多くを学びましたことを期待してください。
Source:
https://www.freecodecamp.org/news/how-to-create-database-migrations-in-go/