3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

SpreadSheetから更新用SQLを生成するお手軽な方法

Last updated at Posted at 2021-02-04

マスタ修正の困りごと

いくらRailsなどでUIが楽に作れるといっても、エクセルやスプレッドシートでマスタを修正する機会はまだまだ残っています。

よくあるフローとしては、こんな感じ。

  1. MySQLなどのDBからCSV出力
  2. CSVをエクセルやGoogleSpreadSheetに取り込み
  3. Sheet上で編集
  4. CSVとして保存
  5. CSVをロード

まぁ面倒。

こんなフローはどうでしょう

  1. DBeaverやSequelProなどのUIからマスタをコピー
  2. GoogleSpreadSheet上にペースト
  3. GoogleSpreadSheet上で編集
  4. GoogleSpreadSheetの数式でSQL生成&コピー
  5. DBeaverやSequelPro上でSQL実行

という流れです。ステップとしては変わりませんが。ファイルが一切登場せず、クリップボードのみのやりとりで可能です。

スプレッドシート上でSQLを生成している例

こんなイメージです。左の黄色がDBからコピーしてきたテーブルです。黄色の部分で編集をします。灰色が中間の計算値フィールド、青色がペーストするSQL文です。

image.png
https://docs.google.com/spreadsheets/d/1TH1p92-F9X-AmyuEy7QOrLrVyGDI7QJSaMphS7TaaNs/edit#gid=0

各数式の説明

カラム名をカンマで繋ぐ

JOIN関数で可能です。

image.png

カラム値をクォートしながらカンマで繋ぐ

ARRAYFORMULA関数は配列を引数に全要素に対して同じ計算をしてくれます。他のプログラミング言語でよく出てくるmap関数に近いです。ARRAYFORMULA関数でクォートで囲み、さらにJOIN関数を使ってカンマでつないでいます。

image.png

カンマでつないだ各値をSQLに変換する

更新処理をするにはプライマリーキーが必要なので、今回もid列がプライマリーキーの前提です。プライマリーキーがあれば、「もし同じキーがあればUPDATEでなければinsert」というREPLACE構文が使えます。

replace inot [テーブル名] (カラム名をカンマでつないだ文字列) values
(値をカンマでつないだ文字列),
(値をカンマでつないだ文字列)

を作ります。

image.png

手抜きポイント

  • フィールド内に出てきたクォートを本当はエスケープすべき
    • やろうと思えば、replace関数を全フィールドにかければいい
    • ARRAYFOMURAを使えば全フィールドに一回で処理できる
  • 最後に余計なカンマがつく
    • 最後にカンマは不要だけどそのロジックをつけるのが面倒で最後までつけてる
    • SQL実行する前に削除するのは手間ではない
  • 削除には対応してない
    • 主キーを元に削除するなら、特にスプレッドシートのUIは要らないから
    • この手のマスタは論理削除みたいなのが多いし
3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?