Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Web開発を支えるマイグレーションツールについて / sqldef introduction for psql users

yudppp
December 07, 2019

Web開発を支えるマイグレーションツールについて / sqldef introduction for psql users

第11回 PostgreSQLアンカンファレンス@東京で発表する資料
https://pgunconf.connpass.com/event/155951/

yudppp

December 07, 2019
Tweet

More Decks by yudppp

Other Decks in Programming

Transcript

  1. Web開発を⽀える
    マイグレーションツールについて
    第11回 PostgreSQLアンカンファレンス@東京

    View Slide

  2. ⾃⼰紹介
    @yudppp
    株式会社HRBrain CTO
    好きな⾔葉: 冪等性

    嫌いなモノ: 浮動⼩数点の誤差
    基本的にWebエンジニア


    View Slide

  3. ⽬標評価管理クラウド

    View Slide

  4. HRBrainとは
    • ⽬標と評価を管理するクラウドSaaSを作って
    いる会社です。
    • リリース開始からもうすぐで3年

    View Slide

  5. 先⽇Buildersconにて

    Row Level Securityは
    マルチテナントの
    銀の弾丸になりうるのか

    という話をしました
    https://speakerdeck.com/yudppp/row-level-security-is-silver-bullet-for-multitenancy

    View Slide

  6. 概要
    • SaaS開発していく上でリリース頻度を⾼く開
    発していくには真のマルチテナント(全ての会
    社の情報が⼀つのDB)にしていきたいが、セ
    キュリティ的な不安要素をPostgreSQLの
    RowLevelSecurityを使って解決した話

    View Slide

  7. PostgreSQL Conference Japanで
    この内容とマイグレーションについて話そうとしたら
    CfP落ちました。。

    View Slide

  8. 現在のリリース頻度
    • 週に2回リリース
    • 毎回ではないがSQLのマイグレーションが頻
    繁に必要

    View Slide

  9. みなさんマイグレーション
    の管理どうされていますか

    View Slide

  10. 元々のマイグレーション管理
    gooseというGo製のToolを利⽤

    View Slide

  11. 起きた問題①
    Aさん「81_modify_user_birthday_col.sql」
    Bさん「81_add_era_table.sql」
    Aさん「Merge!」
    Bさん「Merge!」
    CI 「Test / Deploy 失敗!」

    View Slide

  12. CIでTest実⾏した瞬間は
    ⼤丈夫なので
    Mergeされる前に
    検知するのが難しい

    View Slide

  13. 起きた問題②
    前提:

    みんなでdev環境⼀つを共有していてfeature
    ブランチをSlackで告知すれば好きなタイミ
    ングであげれる運⽤
    (本当はfeatureブランチごとdeployしたい)

    View Slide

  14. 起きた問題②
    Bさん「令和追加した確認するのでdev使い
    ます。」

    CI 「Deployed!」
    Migrationがなぜか呼ばれない。。

    誰かがあげたMigrationがdownされてない

    View Slide

  15. この運⽤をしていると
    Migrationを戻すタイミング
    が難しい

    View Slide

  16. 解決策を探す

    View Slide

  17. k0kubun/sqldef
    The easiest idempotent MySQL/PostgreSQL
    schema management by SQL. This is inspired
    by Ridgepole but using SQL, so there's no need
    to remember Ruby DSL.
    定義したschema.sqlとDB接続した情報を⽐較し
    ていい感じにALTER⽂を流してくれる
    Go製なのでbinaryだけで動く

    View Slide

  18. https://github.com/k0kubun/sqldef

    View Slide

  19. どうなるか
    常にschemaファイルとDBの状態が等しくな
    るので、上記のような問題は起きない。
    もし起きたとしても、schemaファイルが
    Conflictするので気づける。

    View Slide

  20. sqldefの内部実装
    Vitess(Vitess is a database clustering system
    for horizontal scaling of MySQL)のsqlparser
    のsourceを拡張して作られている。
    information_schema.table_constraintsあた
    りをSELECTした結果を元にCREATE⽂を
    Buildしている。

    View Slide

  21. 既知の課題
    基本的な構⽂は対応しているが、Vitessから
    派⽣したこともありPostgreSQLのあまり使わ
    れない構⽂が未対応だったりする。(そう例え
    ばRowLevelSecurityとか)
    sqldefのPostgreSQLのユーザーがそこまで多
    くなさそう。

    View Slide

  22. まとめ
    冪等性が担保された安全な⽣活がしたい。
    sqldefをPostgreSQLで使うユーザーを増やし
    て、より洗礼されたツールになってほしい
    今⽇の発表で1⼈でもユーザーが増えたら嬉
    しい

    View Slide

  23. 参考資料
    •SQLで羃等にDBスキーマ管理ができるツー
    ル「sqldef」を作った (https://
    k0kubun.hatenablog.com/entry/2018/08/
    25/114455)
    •http://vitess.io/

    View Slide