sql >> データベース >  >> RDS >> Mysql

(My)SQLステートメントの構文が正しいかどうかを確認するにはどうすればよいですか?

    Jenkinsで使用するMysqlで構文リンティング用のCLIツールを検索したところ、すぐには何も見つかりませんでした(このStackoverflowの質問は最初の結果の1つです-LOL)次の解決策を思いつきました(OS:Linuxですが、 Windowsでも実行可能):

    次のようなもの:

    lint_result=`mysql mysql_test -B -f -e 'select asdf s where x;' 2>&1`; if [ `echo $lint_result | sed -r "s/ERROR ([0-9]*).*/\1/g"` -eq 1064 ]; then echo -e "Syntax error:\n${lint_result}"; fi
    Syntax error:
    ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where x' at line 1
    

    (SQLファイルを確認するには、-b -e'ステートメント'の代わりに"

    クエリの構文をmysqlで解析できない場合は、次のように主張します。1行目のERROR 1064(42000):SQL構文にエラーがあります。 1行目の''の近くで使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください

    構文が正しい場合にのみ、クエリを実行してテーブルが存在しないことを認識しようとしますが、これはもう面白くありません:

    ERROR 1146 (42S02) at line 1: Table 'mysql_test.s' doesn't exist
    

    そのため、エラー1064は無効な構文です。空のテストデータベースを作成する必要があるのは、FROM部分が間違っているエラーのみが表示されるためです(たとえば、有効な構文チェック結果を取得するには、データベースが必要です。'select asdf from s where x and if;)。

    私がテストした限り、それは正常に動作します(バージョンMysql5.5)。

    ここに完全なbashスクリプトバージョンがあります:

    #!/bin/bash
    
    source_dir=${1};
    database="mysql_test";
    mysql_args="-h127.0.0.1";
    
    mysql $mysql_args -B -e "DROP DATABASE IF EXISTS $database; CREATE DATABASE $database;";
    for file in `find $source_dir -name "*.sql"`; do
        lint_result=`mysql $mysql_args $database -f -b < $file 2>&1`;
        if [ "`echo $lint_result | sed -r \"s/ERROR ([0-9]*).*/\1/g\"`" = "1064" ]; then
            echo -e "Syntax error in file ${file}:\n${lint_result}" && exit 1;
        fi;
    done
    


    1. MountainLionPostgresが接続できませんでした

    2. MySQLの1つを除くすべての列を選択しますか?

    3. 単一のDjangoモデル、複数のテーブル?

    4. 重複キーでは、Nullまたは空の値のみを更新します