Je souhaite vérifier la syntaxe des fichiers contenant des requêtes SQL avant qu'ils ne puissent être validés dans mon projet CVS.
Pour ce faire, j'ai un script commitinfo, mais j'ai du mal à savoir si les commandes SQL sont valides. psql
ne semble pas avoir un mode dryrun, et construire mon propre testeur postgresql-dialact à partir de la grammaire (qui se trouve dans la source) semble être un long processus
Les scripts peuvent contenir plusieurs requêtes. Il est donc impossible de les entourer d'une EXPLAIN
.
Des allusions?
J'ai récemment écrit un utilitaire pour vérifier de manière statique la syntaxe de SQL pour PostgreSQL. Il utilise ecpg, le préprocesseur intégré SQL C pour Postgres, pour vérifier la syntaxe SQL. Il utilise donc exactement le même analyseur intégré à Postgres.
Vous pouvez le vérifier sur github: http://github.com/markdrago/pgsanity . Vous pouvez donner un bref aperçu au README pour avoir une meilleure idée de son fonctionnement et obtenir des instructions pour son installation. Voici un court exemple de la façon dont pgsanity peut être utilisé:
$ 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"
Une solution consiste à l'intégrer à une transaction que vous annulez à la fin:
BEGIN;
<query>;
<query>;
<query>;
ROLLBACK;
Sachez que certains effets ne peuvent pas être annulés, tels que les appels dblink ou tout ce qui est écrit dans le système de fichiers ou des séquences incrémentées.
Je conseillerais de cloner votre base de données à des fins de test.
J'utilise habituellement Validateur SQL en ligne de Mimer , la seule chose à faire est de vérifier la syntaxe SQL pour le code SQL standard:
et non spécifique à PostgreSQL ... Cependant, si vous écrivez du code suivant la norme, vous pourrez l’utiliser et cela fonctionnera bien ...
EXPLAIN (sans ANALYSE) analysera la requête et préparera un plan d'exécution sans l'exécuter réellement.
https://www.postgresql.org/docs/current/static/sql-explain.html
Un utilitaire formidable pour vérifier la syntaxe SQL: SQL Fiddle
Prend en charge MySQL, Oracle, PostgreSQL, SQLite, MS SQL.
Vous pouvez juste l'envelopper dans SELECT 1 ( <your query> ) AS a WHERE 1 = 0;
Cela échouera lors de la validation mais il ne sera pas réellement exécuté. Voici un exemple de plan de requête:
Result (cost=0.00..0.01 rows=1 width=0)
One-Time Filter: false
Vous pouvez exécuter des requêtes fonction iside postgresql et déclencher une exception à la fin. Toutes les modifications seront annulées. Par exemple:
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;
Une autre sollution - plpgsql_check
extension ( sur github ), la prochaine incarnation de pgpsql_lint