注意点
- JavaScriptのDateはミリ秒なので単位をそろえるため1000倍(1秒=1000ミリ秒)する必要がある
- JavaScriptのDateオブジェクトは初期化にTZの引数を持たず、初期化時にシステムのTZが利用される点に注意
const unixTime = 1690862400 // 2023-08-01 13:00:00(JST) const date = new Date(unixTime * 1000)
注意点
const unixTime = 1690862400 // 2023-08-01 13:00:00(JST) const date = new Date(unixTime * 1000)
GitHubActionsをローカルで再現できるnektos/actを利用しているときにJobの処理でgo install
を実施したときに遭遇
actで実行されるubuntuコンテナにルート証明書がないのでインストールすることで対応可能 GitHub上で実行されるときは必要がないのであくまでローカル確認用
- name: Install ca-certificates run: | apt update && apt install -y ca-certificates update-ca-certificates - name: Install govulncheck run: go install golang.org/x/vuln/cmd/govulncheck@latest
goose(グース)と読む forkが多くあるが、今回検証しているのはpressly/goose(ガチョウのコスプレをしたGopherが可愛い
スキーマの管理方法はオーソドックスな管理テーブルにマイグレーションファイルの適用履歴を積み上げていくタイプ
主な特徴
使い勝手やGo製であるという点から競合としてsql-migrateになるか (最近利用されているのを見るsqldefは宣言的スキーマ管理というパラダイムが違うので除く)
利用方法はシンプルなので公式のREADMEなどを参照するのが一番良い
READMEになかったりする気づいた点、気になった点だけ書いていく
どういうことかというと、特定のマイグレーションファイルを管理対象にはしたいが色々な理由で実行はできないという場合(すでに運用されているDBのスキーマをベースラインとして登録したいなど) この場合にgooseだけでは解決できず管理テーブルに手動でマイグレーションファイルが適用済みであるというレコードをインサートする必要がある。 DjangoORMでいうfakeやflywayでいうskipExecutingMigrationsの機能といえばわかりやすい これが移行のときに非常に手間だった、ただこのシチュエーションは例外ではあるので目を瞑った
自分の環境の場合殆どをMakeをタスクランナー化しCLI実行しているため、あまり問題にはならないがgooseのようにコマンドが豊富だとコマンドの数だけタスクを定義する必要があったりでやや面倒ではあった。 結果的には壊滅的な操作や細かいup/downは例外と判断し使うなら直接叩いての精神でタスク化しなかったが面倒ではある。オプションとしてConfigファイルが渡せても良いのではと思った
status
コマンドなどを実行するとデフォルトではgoose_db_version
という名前で管理テーブルが作成される
version_idが0の予約されたレコードが追加されている
現在gooseで検索すると上位にヒットするCyberAgentさんのブログは非常にわかりやすく有用であるが、未適用マイグレーションの扱いの挙動は現時点のverでは変わっており次の挙動となっている
管理テーブルから削除されている例 1つめのセレクトと2つめの間にdownを実行