<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>マイグレーション  |  鉄駆ブログ</title>
	<atom:link href="https://ichi-station.com/tag/%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3/feed/" rel="self" type="application/rss+xml" />
	<link>https://ichi-station.com</link>
	<description></description>
	<lastBuildDate>Fri, 28 May 2021 03:12:34 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.1.5</generator>

<image>
	<url>https://ichi-station.com/wp-content/uploads/2022/04/cropped-blog-favicon512x512-4-32x32.png</url>
	<title>マイグレーション  |  鉄駆ブログ</title>
	<link>https://ichi-station.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>golang-migrateを使用してDBのマイグレーションを管理する</title>
		<link>https://ichi-station.com/golang-migrate/</link>
					<comments>https://ichi-station.com/golang-migrate/#respond</comments>
		
		<dc:creator><![CDATA[いっちー]]></dc:creator>
		<pubDate>Wed, 06 Jan 2021 11:58:04 +0000</pubDate>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Go言語]]></category>
		<category><![CDATA[マイグレーション]]></category>
		<guid isPermaLink="false">https://ichi-station.com/?p=768</guid>

					<description><![CDATA[こんにちは。いっちー(@tetestkake_blog)です！ この記事では、私が個人的に重宝している「golang-migrate」を紹介したいと思います。 マイグレーションって管理が煩雑になりがちですよね。 gola [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>こんにちは。いっちー(<a rel="noopener" href="https://twitter.com/tetsukake_blog" target="_blank">@tetestkake_blog</a>)です！</p>



<p>この記事では、私が個人的に重宝している「golang-migrate」を紹介したいと思います。</p>



<p>マイグレーションって管理が煩雑になりがちですよね。</p>



<p>golang-migrateを使用すると、以下のようなメリットがあります。</p>



<div class="wp-block-cocoon-blocks-caption-box-1 caption-box block-box has-border-color has-amber-border-color"><div class="caption-box-label block-box-label box-label fab-thumbs-up"><span class="caption-box-label-text block-box-label-text box-label-text">golang-migrateを使うメリット</span></div><div class="caption-box-content block-box-content box-content">
<div class="wp-block-cocoon-blocks-iconlist-box iconlist-box blank-box list-hand-o-right block-box"><div class="iconlist-title"></div>
<ul><li>マイグレーションファイルをコード管理できる</li><li>コマンド1発でマイグレーションを実行したり過去に戻したりできる</li></ul>
</div>
</div></div>



<p>このようなメリットがあるので、私が仕事で携わるプロダクトでも採用され活躍しています。</p>



<p>そんな「golang-migrate」を、この記事ではサンプル付きで使い方を解説します。</p>



<p>記事で例示するコードは以下のリポジトリにアップロードしてありますので、よかったら使ってください。</p>



<a rel="noopener" href="https://github.com/yutaiii/go-migrate-sample" title="GitHub - yutaiii/go-migrate-sample: go migration sample" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img src="https://opengraph.githubassets.com/7a284997ad9fe644436d4c460a8c53fdab6466c1b9622e7fe0eb815226de7722/yutaiii/go-migrate-sample" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">GitHub - yutaiii/go-migrate-sample: go migration sample</div><div class="blogcard-snippet external-blogcard-snippet">go migration sample. Contribute to yutaiii/go-migrate-sample development by creating an account on GitHub.</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img src="https://www.google.com/s2/favicons?domain=https://github.com/yutaiii/go-migrate-sample" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">github.com</div></div></div></div></a>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2"><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">データベースのマイグレーションとは？</a></li><li><a href="#toc2" tabindex="0">golang-migrateに関して</a></li><li><a href="#toc3" tabindex="0">golang-migrateのインストール</a></li><li><a href="#toc4" tabindex="0">マイグレーションファイルを準備する</a></li><li><a href="#toc5" tabindex="0">マイグレーションを実行する</a></li><li><a href="#toc6" tabindex="0">マイグレーションを戻す</a></li><li><a href="#toc7" tabindex="0">終わりに</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">データベースのマイグレーションとは？</span></h2>



<p>簡単にマイグレーションの説明を紹介します。知ってるよって方は飛ばしてください。</p>



<p>定義は以下の説明がわかりやすいです。</p>



<blockquote class="wp-block-quote"><p>マイグレーションとは、DBに保存されているデータを保持したまま、テーブルの作成やカラムの変更などを行うための機能です。</p><cite>https://densan-labs.net/tech/codefirst/migration.html</cite></blockquote>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-12 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://ichi-station.com/wp-content/uploads/2021/01/icon_200x200.png" alt="いっちー" class="speech-icon-image"/></figure><div class="speech-name">いっちー</div></div><div class="speech-balloon">
<p>既存のデータを失わずに、テーブルの追加やカラムの追加などのテーブル定義の変更をおこうことをデータベースのマイグレーションというのですね！</p>
</div></div>



<h2><span id="toc2">golang-migrateに関して</span></h2>



<p>golang-migrateはGo言語で書かれたデータベースのマイグレーションツールです。</p>



<p>CLIやライブラリとして使用することができます。</p>



<p>以下のような特徴があります。</p>



<div class="wp-block-cocoon-blocks-caption-box-1 caption-box block-box has-border-color has-amber-border-color"><div class="caption-box-label block-box-label box-label fab-info-circle"><span class="caption-box-label-text block-box-label-text box-label-text">golang-migrateの特徴</span></div><div class="caption-box-content block-box-content box-content">
<div class="wp-block-cocoon-blocks-iconlist-box iconlist-box blank-box list-hand-o-right block-box"><div class="iconlist-title"></div>
<ul><li>番号つけしたSQLファイルをマイグレーションとして使用<ul><li>どのマイグレーションまで実行したかはコマンド1発でわかる</li><li>実行用のupファイル、戻す用のdownファイルを作成する</li></ul></li><li>マイグレーションの実行はコマンド1発で完了する</li></ul>
</div>
</div></div>



<p>DBの定義や変更をマイグレーションファイルに書き起こしておくことで、</p>



<p>データを保持したままDBマイグレーションを進めたり戻したりする作業がコマンド1発で完了できます。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-12 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://ichi-station.com/wp-content/uploads/2021/01/icon_200x200.png" alt="いっちー" class="speech-icon-image"/></figure><div class="speech-name">いっちー</div></div><div class="speech-balloon">
<p>〇〇の機能をリリースする前のDBの状態に戻したいんだよな&#8230; という場合に威力を発揮します！</p>
</div></div>



<p>golang-migrateはMySQL, MongoDB, Redshift, PostgreSQLなど様々なデータベースに対応しています。</p>



<p>その他の対応DBは<a rel="noopener" href="https://github.com/golang-migrate/migrate#databases" data-type="URL" data-id="https://github.com/golang-migrate/migrate#databases" target="_blank">こちら</a>をご覧ください。</p>



<p>golang-migrateは以下のリポジトリでOSSとして公開されています。</p>



<a rel="noopener" href="https://github.com/golang-migrate/migrate" title="GitHub - golang-migrate/migrate: Database migrations. CLI and Golang library." class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img src="https://opengraph.githubassets.com/74b65a306c2f75cffb0aa8aa4c7d261a4ac397158f9f27b5789320c1c5f2af70/golang-migrate/migrate" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">GitHub - golang-migrate/migrate: Database migrations. CLI and Golang library.</div><div class="blogcard-snippet external-blogcard-snippet">Database migrations. CLI and Golang library. Contribute to golang-migrate/migrate development by creating an account on GitHub.</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img src="https://www.google.com/s2/favicons?domain=https://github.com/golang-migrate/migrate" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">github.com</div></div></div></div></a>



<h2><span id="toc3">golang-migrateのインストール</span></h2>



<p>ここからgolang-migrateを実際に使用する手順に関して解説していきます。</p>



<p>macでは以下のコマンドを使用してインストールします。</p>



<pre class="wp-block-code"><code> brew install golang-migrate</code></pre>



<p>確認します。</p>



<pre class="wp-block-code"><code>$ migrate -version
v4.7.0</code></pre>



<p>インストールされていることを確認できました。</p>



<h2><span id="toc4">マイグレーションファイルを準備する</span></h2>



<p>upとdown用の2つのファイルを作成します。</p>



<div class="wp-block-cocoon-blocks-icon-box information-box common-icon-box block-box">
<p>upにはマイグレーションを進めるクエリ、</p>



<p>downはマイグレーションを戻す用のクエリを記述します。</p>
</div>



<p>今回は以下の2ファイルを追加しました。</p>



<p>※サンプルのDBはMySQLを使用しています</p>



<p>1_create_table_sample.up.sql</p>



<pre class="wp-block-code"><code>CREATE TABLE IF NOT EXISTS
sample_db.sample(
    id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    name VARCHAR(255) NOT NULL,
    created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    deleted_at DATETIME DEFAULT NULL,
    PRIMARY KEY(id)
)ENGINE=INNODB DEFAULT CHARSET=utf8mb4;</code></pre>



<p>1_create_table_sample.down.sql</p>



<pre class="wp-block-code"><code>DROP TABLE IF EXISTS
sample_db.sample;</code></pre>



<p>ファイルの先頭の数字はマイグレーションのバージョン番号となり、</p>



<p>この数字を使用して現在どのファイルまでマイグレーションが進んでいるかを判断することができます。</p>



<h2><span id="toc5">マイグレーションを実行する</span></h2>



<p>プロジェクトのルートで以下のコマンドでマイグレーションを実行します。</p>



<pre class="wp-block-code"><code>$ migrate -source file://db/migrate -database 'mysql://root:root@tcp(127.0.0.1:13306)/sample_db' up</code></pre>



<p>テーブルが作成されていれば成功です！</p>



<p>バージョンを確認してみましょう。</p>



<pre class="wp-block-code"><code>$ migrate -source file://db/migrate -database 'mysql://root:root@tcp(127.0.0.1:13306)/sample_db' version
1</code></pre>



<p>マイグレーションの番号が1と表示されていますね！</p>



<h2><span id="toc6">マイグレーションを戻す</span></h2>



<p>次はマイグレーションを戻してみましょう。</p>



<p>新しいマイグレーションファイルを追加します。</p>



<p>2_insert_sample_data.up.sql</p>



<pre class="wp-block-code"><code>INSERT INTO sample
    (name)
VALUES
    ('hoge'),
    ('fuga'),
    ('piyo');</code></pre>



<p>2_insert_sample_data.down.sql</p>



<pre class="wp-block-code"><code>TRUNCATE TABLE sample;</code></pre>



<p>マイグレーションを上げます。</p>



<pre class="wp-block-code"><code>$ migrate -source file://db/migrate -database 'mysql://root:root@tcp(127.0.0.1:13306)/sample_db' up
2/u insert_sample_data (356.557137ms)
$ migrate -source file://db/migrate -database 'mysql://root:root@tcp(127.0.0.1:13306)/sample_db' version
2</code></pre>



<p>以下のコマンドでマイグレーションを下げることができます。</p>



<pre class="wp-block-code"><code>migrate -source file://db/migrate -database 'mysql://root:root@tcp(127.0.0.1:13306)/sample_db' down 1</code></pre>



<p>最後の数字はmigrationを何個戻すかを指定しています。</p>



<p>今回の場合はマイグレーションを1つ戻します。</p>



<p>数字を指定しないと全てのマイグレーションを戻す挙動なので注意が必要です。</p>



<pre class="wp-block-code"><code>$ migrate -source file://db/migrate -database 'mysql://root:root@tcp(127.0.0.1:13306)/sample_db' down
Are you sure you want to apply all down migrations? &#91;y/N]</code></pre>



<p>マイグレーションを進める際にも同様で、最後にどれだけマイグレーションを進めるかを指定できます。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-12 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://ichi-station.com/wp-content/uploads/2021/01/icon_200x200.png" alt="いっちー" class="speech-icon-image"/></figure><div class="speech-name">いっちー</div></div><div class="speech-balloon">
<p>マイグレーションを進める際にはupコマンドを、</p>



<p>戻す際にはdownコマンドを使うというシンプルな構造なので、</p>



<p>とても簡単にマイグレーションの管理ができますね！</p>
</div></div>



<h2><span id="toc7">終わりに</span></h2>



<p>いかがだったでしょうか？</p>



<p>golang-migrateを使用することでマイグレーションファイルをコード管理できて、</p>



<p>DBのマイグレーションを進めたり戻したりが簡単になるため、是非使ってみてください！</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-12 sbs-stn sbp-l sbis-cb cf block-box"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://ichi-station.com/wp-content/uploads/2021/01/icon_200x200.png" alt="いっちー" class="speech-icon-image"/></figure><div class="speech-name">いっちー</div></div><div class="speech-balloon">
<p>Go言語の学習には<a rel="noopener" href="https://amzn.to/3oXQhez" data-type="URL" data-id="https://amzn.to/3oXQhez" target="_blank">基礎からわかるGo言語</a>がよかったのでおすすめです！</p>



<p>それでは！</p>
</div></div>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://ichi-station.com/golang-migrate/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
