構文の正確性については(私の)SQLステートメントを確認するにはどうすればよいですか

StackOverflow https://stackoverflow.com/questions/3970643

  •  09-10-2019
  •  | 
  •  

質問

現在、Integration Serverを設定しており、そのプロセス中にSVNに事前コミットフックを設定しているため、開発者が構文的に無効なファイル(主にPHPとXML)をチェックインできません。

また、.sqlファイル(mysql用)の束もあります。残念ながら、Googleはこのタスクに役立つものを何も表示しませんでした。

何か案は?

役に立ちましたか?

解決

商業 MySQL Workbenchのバージョンには、MySQLステートメント用の構文チェッカーがありますが、もちろんデータベースの側面のみをカバーします。見る http://mysql.com/products/workbench/ (ただし、無料アプリのヘルプインデックスにファクトイドが見つかりましたが)。

他のヒント

Jenkinsで使用するためにMySQLで構文を並べるためのCLIツールを検索した後、すぐに何も見つかりませんでした(このStackOverFlowの質問は最初の結果の1つです - 笑)次のソリューションを思いつきました(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 'ステートメント'の代わりに「<filename.sql」を使用できます)

クエリの構文がmysqlで解析できない場合、それは次のとおりです。適切な構文のためにMySQL Serverバージョンに対応するマニュアルを確認してください。

構文が正しい場合のみ、クエリを実行しようとし、テーブルが存在しないことを認識しますが、これはもう興味深いものではありません。

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

したがって、エラー1064は無効な構文です。空のテストデータベースを作成する必要があります。それ以外の場合は、パーツから間違ったエラーのみが表示されるためです(例えば、有効な構文チェック結果を取得するためにデータベースが必要です。

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

ここに完全なバッシュスクリプトのベースが:

#!/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

がここにあります バリデーター, 、SQL 92/99/2003規格に対して検証しますが、MySQLに言及しているという事実は、SQLクエリでMySQL固有の構文を使用していると信じています。

1つのオプションは、データベースレイヤーを扱う際に不可知論のアプローチに移行し、不可知論のSQLコードを作成することです。明らかに、Mimerと連絡を取り、オフラインにしてCI環境に統合できるかどうかを確認する必要があります。

全体的なアプローチの「IFS」のカップルであり、これはすべて、あなたが現在の状態で不可知論のSQLコードを書くことを喜んで/できるという事実を条件としています。

PHPMyAdmin SQL Parserを使用してSQLファイルを確認するためのCLIツールを書きました。 php-sqllint.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top