Vérification de la syntaxe PostgreSQL sans exécuter la requête
Je veux vérifier la syntaxe des fichiers contenant des requêtes sql avant qu'ils 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 est dans la source) semble être un long tronçon.
Les scripts peuvent contenir plusieurs requêtes, donc un EXPLAIN
ne peut pas être enroulé autour d'eux.
Des indices?
7 réponses
J'ai récemment écrit un utilitaire pour vérifier statiquement la syntaxe de SQL pour PostgreSQL. Il utilise ecpg, le préprocesseur SQL C intégré pour postgres, pour vérifier la syntaxe SQL, de sorte qu'il utilise exactement le même analyseur qui est intégré à Postgres lui-même.
Vous pouvez le vérifier sur github: http://github.com/markdrago/pgsanity . vous pouvez donner un skim au README pour avoir une meilleure idée de comment cela fonctionne et pour obtenir des instructions sur la façon de l'installer. 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 façon serait de le mettre dans une transaction que vous revenez à la fin:
BEGIN;
<query>;
<query>;
<query>;
ROLLBACK;
Sachez que certains effets ne peuvent pas être annulés, comme les appels dblink, ou tout ce qui est écrit dans le système de fichiers ou les séquences incrémentées.
Je conseillerais de cloner votre base de données à des fins de test.
J'utilise habituellement mimer online SQL validator , la seule chose est qu'il vérifie la syntaxe SQL pour SQL standard:
- SQL-92
- SQL-99
- SQL-03
Et non spécifique pour PostgreSQL ... Cependant, si vous écrivez du code suivant la norme, vous pouvez l'utiliser et cela fonctionne bien ...
EXPLAIN (sans analyser) 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 merveilleux utilitaire pour vérifier la syntaxe SQL: SQL Violon
Prend en charge MySQL, Oracle, PostgreSQL, SQLite, MS SQL.
Vous pouvez simplement l'envelopper
SELECT 1 ( <your query> ) AS a WHERE 1 = 0;
Il échouera lors de la validation mais il ne s'exécutera pas réellement. 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 iside fonction postgresql et lever 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 solution - plpgsql_check
extension (sur github), la prochaine incarnation de pgpsql_lint