BackEnd

Go言語で使えるmigrationライブラリ

投稿日:2018年10月25日 更新日:

はじめに

Go言語の連載8回目です。今回はGo言語でWeb開発をする際に使うDB関連のライブラリとして、migrationに絞って調べてみました。

migrationライブラリ

Go言語のmigrationライブラリをいくつかピックアップしました。これらのライブラリを利用することで、データベースに保存されているデータを保持したまま、テーブルの作成やカラムの変更などが行なえます。それでは、各ライブラリの特徴を簡単に紹介します。より詳しい説明はこちらご覧ください。

goose

gooseはGitHub版とBitbucket版でソースコードが異なるようです。GitHub版ではプレフィックスとして5桁の数値が追加され、Bitbucket版ではプレフィックスとしてタイムスタンプ追加されます。環境ごとに設定ファイルを作ることができます(執筆時点でのスター数は575)

sql-migrate

sql-migrateはgooseと同じようなことができます。対応するドライバはgooseより多いようです(執筆時点でのスター数は1,114)

migu

miguはGoのstructをテーブル定義として使用するため、わざわざマイグレーションファイルを書かかなくて良いという利点があります。反面、ロールバックはできません(執筆時点でのスター数は42)

pop

popはコマンドでデータベースを作れます。また、created_atとupdated_atが自動的に追加され、popのORMを使う場合は自動的に更新されます。ただし、2つのファイルにUPとDOWNを分けて書く必要があります(執筆時点でのスター数は476)

sqldef

sqldefは他のライブラリと異なりスキーマファイルの差分を修正するSQLを発行します。それにより、シンプルにスキーマを管理することができます(執筆時点でのスター数は313)

sqldefを使ってみる

今回はスキーマの管理がシンプルなsqldefを使ってみます。

導入

こちらのように自分にあったバイナリをダウンロードします。今回はMac用のmysqlder_darwin_amd64.zipをダウンロードします。ダウンロード後、中身を任意のディレクトリに移動させます(今回は$GOROOT/binに移動させました)

テーブルを追加

準備ができたところで、早速データベースにテーブルを追加してみます。sqldefではschema.sqlファイルにスキーマ情報を定義します。まずは、下記のようにユーザテーブルを定義します。

準備ができたら、下記のとおりスキーマを更新します。

すると、データベース(mysqldef_test)にuserテーブルが追加されます。追加されたuserテーブルは下記のとおりです。

また、下記のようにdry runで確認することもできます。

スキーマを更新する

次に、userテーブルのスキーマを更新してみましょう。先程作成したschema.sqlを修正して、もう一度コマンドを実行します(4行目、5行目、8行目を追記しました)

発行されるクエリは下記のとおりです。

修正後のテーブルは下記のとおりです。

既存のスキーマをexportする

既存のスキーマのexportは下記のとおり行います。

対応しているコマンド一覧

sqldefが対応しているコマンドは下記のとおりです(MySQLのみ載せてあります。PostgreSQLについてはこちらをご覧ください)

  • CREATE TABLE, DROP TABLE
  • ADD COLUMN, CHANGE COLUMN, DROP COLUMN
  • ADD INDEX, ADD UNIQUE INDEX, CREATE INDEX, CREATE UNIQUE INDEX, DROP INDEX
  • ADD PRIMARY KEY, DROP PRIMARY KEY
  • ADD FOREIGN KEY, DROP FOREIGN KEY

さいごに

今回はGo言語でのマイグレーション管理のためのライブラリを紹介しました。次回はORMについて紹介する予定です。

おすすめ書籍

スターティングGo言語 (CodeZine BOOKS) Goプログラミング実践入門 標準ライブラリでゼロからWebアプリを作る impress top gearシリーズ みんなのGo言語[現場で使える実践テクニック] Go言語でつくるインタプリタ

blog-page_footer_336




blog-page_footer_336




-BackEnd
-,

執筆者:

免責事項

このブログは、記事上部に記載のある投稿日時点の一般的な情報を提供するものであり、投資等の勧誘・法的・税務上の助言を提供するものではありません。仮想通貨の投資・損益計算は複雑であり、個々の取引状況や法律の変更によって異なる可能性があります。ブログに記載された情報は参考程度のものであり、特定の状況に基づいた行動の決定には専門家の助言を求めることをお勧めします。当ブログの情報に基づいた行動に関連して生じた損失やリスクについて、筆者は責任を負いかねます。最新の法律や税務情報を確認し、必要に応じて専門家に相談することをお勧めします。


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


関連記事

Rust入門してみた (構造体 / トレイト)

1 はじめに2 構造体2.1 メソッド2.1.1 関連メソッド2.2 トレイト2.2.1 構造体のフィールドの1つとして、トレイトのインスタンスを持つ場合2.3 derive属性3 おすすめ書籍 はじ ...

Go言語

Go言語でGinkgoを利用してBDDしてみた

1 はじめに2 BDDとは3 Ginkgoについて3.1 Ginkgoの概要3.1.1 Describe3.1.2 Context3.1.3 It3.1.4 JustBeforeEach3.1.5 B ...

rails

Capistrano3でRailsアプリケーションをデプロイする

1 はじめに1.1 前提条件2 Cpistranoについて3 導入3.1 Gemのインストール3.2 設定ファイルの準備4 デプロイ設定4.1 Capfileを修正する4.2 各環境で共通のデプロイ設 ...

Go言語

Go 1.18で追加されるGenericsの紹介

1 はじめに2 GoのGenerics2.1 Genericsの主な仕様2.2 Genericsの制限3 Genericsを使ってみる3.1 基本形3.2 呼び出しの際の型引数を省略する3.3 型制約 ...

laravel logo

LaravelでHTTP通信

1 はじめに2 インストール3 基本的な使い方3.1 GETでリクエストを投げる3.2 リクエストヘッダーを指定3.3 クエリパラメータを指定3.4 timeout時間を指定3.5 POSTでリクエス ...

フォロー

blog-page_side_responsive

2018年10月
 123456
78910111213
14151617181920
21222324252627
28293031  

アプリ情報

私たちは無料アプリもリリースしています、ぜひご覧ください。 下記のアイコンから無料でダウンロードできます。