質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

1回答

1418閲覧

シェルスクリプトで、mysqlのDB内テーブルのカラム有無をチェックしたい

YoheiKobayashi

総合スコア15

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

0クリップ

投稿2022/03/27 15:01

編集2022/03/27 15:06

シェルスクリプトの知見が浅く、質問を投稿させていただきました。

実現したいこと

テーブル名に一定の規則を持った複数のテーブルに対し、一斉にカラムの追加を行うといった作業を予定しており、「もしカラムが存在しなければALTER TABLEでカラムを追加する」といった機能を実現したいと考えています。

問題

それにあたり 「カラムの存在チェック」を目的として下記のように information_schema.columns からカラムの存在数を確認しようとしましたが、参照することが出来ません。

■ 該当の記述

CMD="echo 'select count(*) from INFORMATION_SCHEMA.COLUMNS where TABLE_SCHEMA='$DB' and TABLE_NAME='$table' and COLUMN_NAME='IMAGE_THUMBNAIL';' | mysql $OPTIONS$PW"

上記記述でERROR 1054 (42S22) at line 1: Unknown column 'table_name' in 'where clause'となり、落ちてしまいます。

■ ソース全体(下から6行目が該当行)

#!/bin/bash # 引数1:DB名を指定 # 引数2:更新テーブルの末尾を指定 # 引数3:sqlのパスワードを指定 #引数チェックによりusageを返す if [ "$1" = "" ] || [ "$2" = "" ]; then cat <<-EOS usage $0 [db name] [end of the table name] [mysql password] EOS exit fi # 変数 DB=$1 TABLE=$2"$" OPTIONS="-u root -D $DB -p" if [ "$3" != "" ]; then PW=$3 fi # テーブル名の取得 TABLES=`ECHO 'show tables;' | mysql $OPTIONS | grep -E "$TABLE"` # テーブル名の確認 ECHO "$TABLES" # 処理の確認 echo -n "実行します。よろしいですか? [y/N]: " read ANS case $ANS in [Yy]* ) echo "Yes: 処理を実行します" for table in $TABLES do CMD="echo 'select count(*) from INFORMATION_SCHEMA.COLUMNS where TABLE_SCHEMA='$DB' and TABLE_NAME='$table' and COLUMN_NAME='IMAGE_THUMBNAIL';' | mysql $OPTIONS$PW" eval "$CMD" echo done ;; * ) echo "No: 処理をキャンセルしました" ;; esac

試したこと

試したこととしては、以下になります。

  • mysqlに自身でログインした際は、問題なくinformation_schema.columns を参照できる
  • 該当行を他のテーブル参照に差し替えて実行(select文等)した場合は、問題なく実行できる

こちら、原因についてアドバイスなどいただけれれば嬉しいです。尚、 mysqlバージョンは5.6になります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2022/03/27 17:20

'$DB' や '$table' の ' が消えちゃってますね。 CMD="echo \"select count(*) from INFORMATION_SCHEMA.COLUMNS where TABLE_SCHEMA='$DB' and TABLE_NAME='$table' and COLUMN_NAME='IMAGE_THUMBNAIL';\" | mysql $OPTIONS$PW" かな。(というか、いったん $CMD にセットせずに直接実行した方がわかりやすいのでは。)
melian

2022/03/27 20:41

bash script ということなので $'' notation を使うとよいかもしれません。 CMD="echo $'select count(*) from INFORMATION_SCHEMA.COLUMNS where TABLE_SCHEMA=\'$DB\' and TABLE_NAME=\'$table\' and COLUMN_NAME=\'IMAGE_THUMBNAIL\';' | mysql $OPTIONS$PW"
YoheiKobayashi

2022/03/27 21:17

hoshi-takanoriさん、melianさん、ありがとうございます! ご指摘の通りに実施し動かすことが出来ました。
guest

回答1

0

自己解決

「質問への追記・修正の依頼」にて2件ご指摘頂いたとおり、以下記述で期待通りの動作が確認出来ました。
ご指摘、ありがとうございました。
bash script の基本を見直すべきと反省中。

CMD="echo \"select count(*) from INFORMATION_SCHEMA.COLUMNS where TABLE_SCHEMA='$DB' and TABLE_NAME='$table' and COLUMN_NAME='IMAGE_THUMBNAIL';\" | mysql $OPTIONS$PW" # または CMD="echo $'select count(*) from INFORMATION_SCHEMA.COLUMNS where TABLE_SCHEMA=\'$DB\' and TABLE_NAME=\'$table\' and COLUMN_NAME=\'IMAGE_THUMBNAIL\';' | mysql $OPTIONS$PW"

投稿2022/03/27 21:26

YoheiKobayashi

総合スコア15

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

68user

2022/03/28 00:50

スクリプト先頭あたりに set -x 入れておくとか (bash -x script.sh でも可)、 mysql に -v オプション付けて SQL 表示させるとか、 まずは SQL="echo ...." して $SQL の中身を確認するとか、 などの方法で自力で気付けるようになると思います。
YoheiKobayashi

2022/03/28 08:14

69user様、ご指摘アドバイスありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問