it-swarm.com.de

PostgreSQL-Syntaxprüfung ohne Ausführen der Abfrage

Ich möchte die Syntax von Dateien überprüfen, die SQL-Abfragen enthalten, bevor sie in meinem CVS-Projekt festgeschrieben werden können. 

Dafür habe ich ein commitinfo-Skript, aber ich habe Schwierigkeiten, herauszufinden, ob die SQL-Befehle gültig sind. psql scheint keinen Dryrun-Modus zu haben, und das Erstellen meines eigenen Postgresql-Dialact-Testers aus der Grammatik (das heißt in der Quelle) scheint eine lange Strecke zu sein. 

Die Skripts können mehrere Abfragen enthalten, sodass eine EXPLAIN nicht um sie herum eingeschlossen werden kann. 

Irgendwelche Hinweise?

31
RobAu

Ich habe vor kurzem ein Dienstprogramm geschrieben, um die Syntax von SQL für PostgreSQL statisch zu überprüfen. Es nutzt ecpg, den eingebetteten SQL-C-Präprozessor für Postgres, um die SQL-Syntax zu überprüfen. Es verwendet also genau denselben Parser, der in Postgres selbst integriert ist.

Sie können es auf github überprüfen: http://github.com/markdrago/pgsanity . Sie können dem README einen Skim geben, um eine bessere Vorstellung davon zu bekommen, wie es funktioniert, und um Anweisungen zur Installation zu erhalten. Hier ist ein kurzes Beispiel, wie Pgsanity verwendet werden kann:

$ 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"
38
Mark Drago

Eine Möglichkeit wäre, es in eine Transaktion einzufügen, die Sie am Ende rückgängig machen:

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

Beachten Sie, dass es einige Effekte gibt, die nicht rückgängig gemacht werden können, wie zum Beispiel dblink - Aufrufe oder alles, was in das Dateisystem oder inkrementierte Sequenzen geschrieben wird.

Ich würde empfehlen, Ihre Datenbank zu Testzwecken zu klonen.

13

Normalerweise verwende ich Mimer Online SQL Validator . Die einzige Sache ist, dass SQL-Syntax für Standard-SQL geprüft wird:

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

und nicht spezifisch für PostgreSQL ... Wenn Sie jedoch Code schreiben, der dem Standard entspricht, können Sie ihn verwenden und er funktioniert gut ...

6
aleroot

EXPLAIN (ohne ANALYZE) analysiert die Abfrage und erstellt einen Ausführungsplan, ohne ihn tatsächlich auszuführen.

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

5
karlgold

Ein wunderbares Dienstprogramm zum Überprüfen der SQL-Syntax: SQL Fiddle

Unterstützt MySQL, Oracle, PostgreSQL, SQLite und MS SQL.

2
Anshul Tiwari

Sie könnten es einfach in SELECT 1 ( <your query> ) AS a WHERE 1 = 0; einpacken.

Bei der Validierung schlägt der Vorgang fehl, wird jedoch nicht ausgeführt. Hier ist ein Beispiel für einen Abfrageplan:

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

Sie können Abfragen ausführen, iside postgresql-Funktion und am Ende eine Ausnahme auslösen. Alle Änderungen werden zurückgesetzt. Zum Beispiel:

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;

Eine weitere Sollution - plpgsql_check extension ( on github ), die nächste Inkarnation von pgpsql_lint

0
shcherbak