ゆずめも

メモ的なブログです。主に勉強した事について書いてます。

go modules環境でgolang-migrate/migrateを動かす

goを始めたのはいいがmodules周りがよくわからず、migrationしたいだけなのに手間取ったのでメモ

github.com

tl;dr

  • cliをインストール
  • migration用のファイルを書く
  • mysqlの起動
  • mysqlに対してmigrate実行

cliのインストール

そもそもmigrateはcliで実行することもできるし、プログラムを書いて実行することもできるみたい

可能な限りコードは書きたく無い精神で今回はcliを試していきます

インストール

macであれば以下のコマンドでインストールできます

brew install golang-migrate

開発環境はmacですが一応環境に縛られない方法でためそうと思いgo getで取得する方法でチャレンジします

go mod init
go get -tags 'mysql' -u github.com/golang-migrate/migrate/cmd/migrate

もっと詳しく知りたい方は以下のURLを参照ください

github.com

migration用のファイルを書く

今回はmigrateディレクトリを作成し、その中にmigration用のファイルを作成していきます

migrate公式が書いているベストプラクティスを見ると以下の方式でソートできるようにバージョンをつけるといいみたいです*1

{version}_{title}.up.{extension}
{version}_{title}.down.{extension}

イメージとしては{version}に連番を振るかtimestampを使うのが推奨されてるようです

1_initialize_schema.down.sql
1_initialize_schema.up.sql
2_add_table.down.sql
2_add_table.up.sql
...

# or

1500360784_initialize_schema.down.sql
1500360784_initialize_schema.up.sql
1500445949_add_table.down.sql
1500445949_add_table.up.sql
...

今回は連番で書くことにします

upの処理を書く

migrateディレクトリ内に1_initialize_schema.up.sqlを作成し、以下のようにtableを作成するSQLを記述します

create table nogizaka (
    id integer auto_increment primary key,
    name varchar(40),
    height integer
)

downの処理

migrateディレクトリ内に1_initialize_schema.down.sqlを作成し、upの時に作ったものを打ち消す処理を記述します

drop table nogizaka

もしalter tableしたのなら、そのalter tableを打ち消すalter table書くみたいな感じですね

mysqlの起動

dockerを使用して、mysqlを起動します

Docker Hub

docker run --name test-mysql -e MYSQL_ROOT_PASSWORD=asuka -e MYSQL_DATABASE=sakamichi -d -p 3306:3306 mysql:8.0

mysqlに対してmigrate実行

database/mysql/README.mdmysqlに接続する際のサンプルが書いてますので、これを参考に実行してみます

github.com

migrate -source file://migrate/ -database 'mysql://root:asuka@tcp(127.0.0.1:3306)/sakamichi' up 1

これでmysql workbenchやmycliなどを使用してmysqlにアクセスするとsakamichiデータベースにnogizakaテーブルが作成されています

mycli -u root -h 127.0.0.1 sakamichi #password: asuka

次にdownを試してみます

migrate -source file://migrate/ -database 'mysql://root:asuka@tcp(127.0.0.1:3306)/sakamichi' down 1

実行後再度mysqlでテーブルの一覧を確認するとsakamichiテーブルがdropされています

まとめ

最初はmigrateのcliのインストール方法がよくわからずつまずきましたが、結果的にはgo modulesはあんまり関係なかったです。すいません。。

今回使用したコードは以下のリポジトリに入れてありますのでよければ

github.com

AsyncStorageをreact-native-community版に移行する

react nativeにはAsyncStorageというデータの永続化に使用する機能がありますが、今後react nativeのコアから出されてreact-native-community下に移されるみたいです

github.com

そのため将来的にAsyncStorageを使用しているアプリはこのパッケージに移行しないといけないということで、現在仕事で作成しているrnアプリ(0.58.6)に導入してみましたのでそのメモ

install

以下のコマンドでasyncstorageのパッケージを取得します

# Install
yarn add @react-native-community/async-storage

# Link
react-native link @react-native-community/async-storage

先に当時の最新バージョンである0.59.6で動作を確認した時には上記の処理を行えば動作させることができました

Podを使っている場合

仕事で使っているアプリではPodを使っているのでios/Podfileに以下の設定を記述しpod installでライブラリを使用するように設定を行います

pod 'RNCAsyncStorage', :path => '../node_modules/@react-native-community/async-storage

余談

作成中のrnアプリでは上記手順を行うと以下のようなエラーがでました

Loading dependency graph...jest-haste-map: @providesModule naming collision:
  Duplicate module name: react-native
  Paths: /Users/.../App/Finalv2/node_modules/react-native/package.json collides with /Users/.../App/Finalv2/ios/Pods/React/package.json

調べた所stackoverflowで以下の設定をPodfileに追加することで機能するようになりました

pod 'React', :path => '../node_modules/react-native'
pod 'yoga', :path => '../node_modules/react-native/ReactCommon/yoga'

動作

react-native-communityのasyncstorageに変更してもドキュメントを見ている感じであれば、現在のasync storageからなくなっているものが無さそうなのでそのまま動くと思います。

実際に作成中のrnでも試してみましたが以下のようにimport文を書き換えるだけで移行が終了しました

// before
import {AsyncStorage} from 'react-native'

// after
import AsyncStorage from '@react-native-community/async-storage'

Intellij IDEAの設定を同期する

thinkpad上のubuntuで開発してたんですが、macに開発環境を作る際に設定が面倒で環境を同期する方法を調べました

同期方法

設定の同期方法には公式見てる感じ2種類あるみたいですが、今回はIDEの設定同期機能を使います

pleiades.io

設定

まず設定に使う"IDE Setting Sync"プラグインをインストールします

f:id:yuzu441:20190317114809p:plain

次は適当にプロジェクトを開いて、Fileメニューからを「Sync Settings to JetBrains Account」クリックし設定をjetbrainsのサーバーにアップロードします*1

f:id:yuzu441:20190317122858p:plain

ここでチェックボックスにチェックを入れておくと、プラグインの有効/無効も裏で同期してくれるみたいなので必要に応じてチェックを入れると良いと思います

f:id:yuzu441:20190317114833p:plain

確認

設定が完了したので、同期させたいPCでIntellij IDEAをインストールして確認します。手順としては上記の手順と同じで同期することが可能ですので特に書くことがないです

まとめ

今回はIDE設定同期機能を使ったんですが、チームなどで設定を共有するのであれば設定リポジトリ機能を使うとメンバーで設定を楽に共有することができるみたいですが別に自分の設定を共有したい気持ちが無いので、設定したくなったら試してみたいですね (なんかめちゃくちゃコミットされるらしいw)

*1:プロジェクトを開かずに設定同期の設定を行う箇所が見つけられなかったので知ってる人いたら教えてほしい