22

現在、統合サーバーをセットアップしています。そのプロセス中に、開発者が構文的に無効なファイル (主に PHP と XML) をチェックインできないように、SVN に pre-commit フックをセットアップしました。

また、リントしたい .sql ファイル (MySQL 用) も多数あります。残念ながら、Google はこのタスクに役立つものを見つけられませんでした。

何か案は?

4

5 に答える 5

12

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 'statement' の代わりに "< filename.sql" を使用できます)

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

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

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

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

テストした限りでは正常に動作します (バージョン Mysql 5.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
于 2013-04-25T19:14:55.253 に答える
6

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

于 2010-10-20T02:33:13.037 に答える
4

これは SQL 92/99/2003 標準に対して検証するバリデーターですが、MySQL について言及しているという事実から、SQL クエリで MySQL 固有の構文を使用していると思われます。

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

全体的なアプローチにはいくつかの「if」があり、これはすべて、現在の状態で、不可知論者の SQL コードを書く意思がある/できるという事実に左右されます。

于 2010-10-19T16:56:18.127 に答える