Проверка синтаксиса PostgreSQL без выполнения запроса - PullRequest
37 голосов
/ 25 ноября 2011

Я хочу проверить синтаксис файлов, содержащих SQL-запросы, прежде чем их можно будет зафиксировать в моем проекте CVS.

Для этого у меня есть скрипт commitinfo, но я не могу определить, действительны ли команды sql.psql, похоже, не имеет режима сухого запуска, и создание моего собственного тестера postgresql-dialact из грамматики (то есть в источнике) кажется длинным отрезком.

Скрипты могут содержать несколько запросов, поэтому EXPLAIN не может быть обернут вокруг них.

Есть подсказки?

Ответы [ 7 ]

42 голосов
/ 03 ноября 2012

Я недавно написал утилиту для статической проверки синтаксиса SQL для PostgreSQL. Он использует ecpg, встроенный препроцессор SQL C для postgres, для проверки синтаксиса SQL, поэтому он использует точно такой же синтаксический анализатор, который встроен в сам Postgres.

Вы можете проверить это на github: http://github.com/markdrago/pgsanity. Вы можете дать README обзор, чтобы лучше понять, как он работает, и получить инструкции по его установке. Вот краткий пример того, как можно использовать pgsanity:

$ 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"
13 голосов
/ 25 ноября 2011

Один из способов заключается в том, чтобы поместить его в транзакцию, которую вы откатываете в конце:

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

Имейте в виду, что существуют некоторые эффекты, которые нельзя откатить, например dblink вызовы или что-либо записанное в файловую систему или инкрементные последовательности.

Я бы посоветовал клонировать вашу базу данных для целей тестирования.

6 голосов
/ 31 мая 2016

EXPLAIN (без ANALYZE) проанализирует запрос и подготовит план выполнения, фактически не выполняя его.

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

6 голосов
/ 25 ноября 2011

Я обычно использую Mimer онлайн-валидатор SQL , единственное, что он проверяет синтаксис SQL для стандартного SQL:

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

и не относится к PostgreSQL ... Однако, если вы пишете код, соответствующий стандарту, вы можете использовать его, и он будет работать хорошо ...

3 голосов
/ 04 мая 2016

Замечательная утилита для проверки синтаксиса SQL: SQL Fiddle

Поддерживает MySQL, Oracle, PostgreSQL, SQLite, MS SQL.

1 голос
/ 10 марта 2017

Вы можете выполнять запросы из функции postgresql и вызывать исключение в конце.Все изменения будут отменены.Например:

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;

Другое решение - plpgsql_check расширение ( на github ), следующее воплощение pgpsql_lint

1 голос
/ 17 октября 2015

Вы можете просто обернуть его в SELECT 1 ( <your query> ) AS a WHERE 1 = 0;

При проверке произойдет сбой, но на самом деле он не будет выполнен.Вот пример плана запроса:

Result  (cost=0.00..0.01 rows=1 width=0)
  One-Time Filter: false
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...