🥓

[BigQuery]シェルスクリプトで特定の文字列を含むテーブルを一括削除する

2022/07/29に公開

シェルスクリプトで特定の文字列を含むテーブルを一括削除するサンプルコード(覚書き)
一括としてますが、内部で、bqコマンドを使って順に削除していく形となっています

前提条件

コード

特定の文字列を含む(部分一致)テーブル削除のコードは以下の通り。
今回は、-dummy, -test-を含むテーブルを削除する、という内容になっています

本処理にて、変数tablesに削除したいテーブルに含まれる文字列を指定し、順に関数dropTablesを呼び出して削除させています

前方一致や後方一致が良い場合は、dropTables内の1行目の記述「"%'$1'%"」を「"%'$1'"」や「"$1'%"」に変更してください

また、「dataset_id」は接続先プロジェクトの本処理を実行させたいデータセット名(ID)に書き換えてください。

dropTables.sh
#!bin/bash

#
# 特定の文字列を含むテーブルを削除する
#

#
# テーブルを削除する
# S1 テーブル名(部分一致)
#
function dropTables(){
    sql='select table_id from `dataset_id.__TABLES__` where table_id like "%'$1'%"'
    bqResultBefore=`bq query --nouse_legacy_sql $sql`

    # テーブル一覧を配列に入れる(bq query実行結果からsedで不要なパーツを切り取りの後)
    tables=(`echo $bqResultBefore | sed -e "s/\+-*\+//g" -e "s/ | //g" -e "s/table_id//g" -e "s/|//g"`)

    echo "$1テーブル群の削除を開始します"
    for table in ${tables[@]}
    do
        bq rm -f dataset_id.$table
        echo "$tableを削除しました"
    done
    echo "$1テーブル群の削除を終了します"

    bqResultAfter=`bq query --nouse_legacy_sql $sql`
    # クエリ結果の有無で成否を判定
    if [ -z "$bqResultAfter" ]; then
            return 0
    else
            return 1
    fi
}

#
# エラーメールの送信
# 送信元: hoge@example.com
# 送信先: fuga@example.com
#
# $1 エラーメッセージ
#
function sendErrorMail(){
  HOSTNAME=$(hostname)
  echo -e $1
  echo -e $1 | mail -s "テーブル削除処理失敗@${HOSTNAME}" -r hoge@example.com fuga@example.com
}

# 以下、本処理

echo "テーブルの削除を開始します"

# 削除したいテーブルに含まれる文字列
tables=("-dummy-" "-test-")

errorTables=''

for table in ${tables[@]}
do
    dropTables $table
    if [ $? -eq 0 ]; then
        echo "$tableの削除に成功しました"
    else
        echo "$tableの削除に失敗しました"
        $errorTables+=$table','
    fi
done

if [ -n "$errorTables" ]; then
  message="${errorTables/%?/}の削除処理に失敗しました\n"
  message+="詳細はログをご確認ください\n"
  sendErrorMail $message
fi

echo "テーブルの削除を終了します"

終わりに

テスト用にテーブル作ったテーブルを一括削除したかったけれど、bq rm -dummy- みたいなワイルドカードを使った実行はできないようなので(逆にできたらキケンか・・)、シェルスクリプトにしてみました。

bqコマンドの実行結果そのままだと不要な文字列まで入ってしまうので、sedコマンドで不要な部分はカット!sedコマンド様様!!

参考

Discussion