web-dev-qa-db-fra.com

Vérification de la syntaxe de PostgreSQL sans exécuter la requête

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?

31
RobAu

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

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.

13
Erwin Brandstetter

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:

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

et non spécifique à PostgreSQL ... Cependant, si vous écrivez du code suivant la norme, vous pourrez l’utiliser et cela fonctionnera bien ...

6
aleroot

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

5
karlgold

Un utilitaire formidable pour vérifier la syntaxe SQL: SQL Fiddle

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

2
Anshul Tiwari

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
1
Jeff Wu

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

0
shcherbak