web-dev-qa-db-ja.com

クエリを実行しないPostgreSQL構文チェック

SQLクエリを含むファイルの構文を、CVSプロジェクトでコミットする前に確認したい。

それを行うために、私はcommitinfoスクリプトを持っていますが、sqlコマンドが有効かどうかを見つけるのに苦労しています。 psqlにはドライランモードがないようで、(ソースにある)文法から独自のpostgresql-dialactテスターを構築するのは長いストレッチのようです。

スクリプトには複数のクエリが含まれる場合があるため、EXPLAINでそれらを囲むことはできません。

ヒントはありますか?

38
RobAu

最近、PostgreSQLのSQLの構文を静的にチェックするユーティリティを作成しました。 postgresの埋め込みSQL Cプリプロセッサであるecpgを利用してSQL構文をチェックするため、Postgres自体に組み込まれているものとまったく同じパーサーを使用します。

Githubで確認できます: http://github.com/markdrago/pgsanity 。 README=を使って、どのように動作するかをよりよく理解し、インストール方法の指示を得ることができます。pgsanityの使用方法の簡単な例を次に示します。

$ pgsanity good1.sql good2.sql bad.sql
bad.sql: line 1: ERROR: syntax error at or near "bogus_token"

$ find -name '*.sql' | xargs pgsanity
./sql/bad1.sql: line 59: ERROR: syntax error at or near ";"
./sql/bad2.sql: line 41: ERROR: syntax error at or near "insert"
./sql/bad3.sql: line 57: ERROR: syntax error at or near "update"
44
Mark Drago

1つの方法は、最後にロールバックするトランザクションに入れることです。

BEGIN;
<query>;
<query>;
<query>;
ROLLBACK;

dblink 呼び出し、またはファイルシステムに書き込まれたもの、またはインクリメントされたシーケンスなど、ロールバックできない効果があることに注意してください。

テスト目的でデータベースのクローンを作成することをお勧めします。

13

EXPLAIN(ANALYZEなし)は、クエリを解析し、実際に実行せずに実行プランを準備します。

https://www.postgresql.org/docs/current/static/sql-explain.html

6
karlgold

私は通常 Mimer online SQL validator を使用していますが、唯一のことは標準SQLのSQL構文をチェックすることです:

  • SQL-92
  • SQL-99
  • SQL-03

postgreSQLに特化したものではありません...ただし、標準に従ってコードを記述すれば、それを使用でき、うまく機能します...

6
aleroot

SQL構文を検証する素晴らしいユーティリティ: SQL Fiddle

MySQL、Oracle、PostgreSQL、SQLite、MS SQLをサポートします。

3
Anshul Tiwari

SELECT 1 ( <your query> ) AS a WHERE 1 = 0;でラップすることができます

検証に失敗しますが、実際には実行されません。クエリプランの例を次に示します。

Result  (cost=0.00..0.01 rows=1 width=0)
  One-Time Filter: false
1
Jeff Wu

Postgresql関数でクエリを実行し、最後に例外を発生させることができます。すべての変更がロールバックされます。例えば:

CREATE OR REPLACE FUNCTION run_test(_sp character varying)
  RETURNS character varying AS
$BODY$
BEGIN
  EXECUTE 'SELECT ' || _sp;
  RAISE EXCEPTION '#OK';
EXCEPTION
  WHEN others THEN
    RETURN SQLERRM;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

別のソリューション-plpgsql_check拡張( github )、pgpsql_lintの次の化身

1
shcherbak