hene

hene.dev

MySQL で管理している全テーブルの名前とプライマリーキーを CSV に出力

MySQL で管理している全テーブルの名前とプライマリーキーを CSV に出力

RDS のデータを BigQuery にインポートしている。

今回やること

MySQL で管理している全テーブルの名前とプライマリーキーを管理したいので CSV を生成する。

テーブル名とプライマリーキーを CSV に出力

MySQL Server に接続する場合

$ ./dump_tablenames.sh "mysql -u ${USERNAME} -p${DB_PASSWORD}" $DATASET_NAME

Amazon Aurora MySQL に接続する場合

$ ./dump_tablenames.sh "mysql -u ${USERNAME} -p${DB_PASSWORD} -h ${RDS_HOST_NAME} -P ${DB_PORT}" $DATASET_NAME

出力された CSV

articles,id
users,id

実装

dump_tablenames.sh

#!/bin/bash -xe

MYSQL=$1
DATASET_NAME=$2

# ./tablenames/${DATASET_NAME}_tablenames.csv を更新
dump_tablenames_query=$(cat ./sql/dump_tablenames.template.sql | DATASET_NAME=$DATASET_NAME envsubst)
$MYSQL -N -B -e "${dump_tablenames_query}" | sed 's/\t/,/g' > ./tablenames/${DATASET_NAME}_tablenames.csv

dump_tablenames.template.sql

PRIMARY KEY がないテーブルを考慮して、INFORMATION_SCHEMA.TABLES に対して LEFT JOIN している。

SELECT
  TABLES.TABLE_NAME
  , COLUMNS.PRIMAY_KEY
FROM INFORMATION_SCHEMA.TABLES AS TABLES
LEFT JOIN (
  SELECT
    TABLE_NAME
    , COLUMN_NAME AS PRIMAY_KEY
  FROM INFORMATION_SCHEMA.COLUMNS
  WHERE
    TABLE_SCHEMA = '${DATASET_NAME}'
    AND COLUMN_KEY = 'PRI'
) AS COLUMNS
  ON TABLES.TABLE_NAME = COLUMNS.TABLE_NAME
WHERE
  TABLES.TABLE_SCHEMA = '${DATASET_NAME}'

参考

関連記事