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?

29
demandé sur RobAu 2011-11-25 20:06:31

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"
37
répondu Mark Drago 2012-11-03 14:12:49

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.

13
répondu Erwin Brandstetter 2014-10-24 03:12:16

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 ...

6
répondu aleroot 2011-11-25 16:22:37

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

5
répondu karlgold 2016-05-30 21:43:19

Un merveilleux utilitaire pour vérifier la syntaxe SQL: SQL Violon

Prend en charge MySQL, Oracle, PostgreSQL, SQLite, MS SQL.

2
répondu Anshul Tiwari 2016-05-04 12:59:41

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
1
répondu Jeff Wu 2015-10-16 23:04:18

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

0
répondu shcherbak 2017-03-10 10:18:54