Проверка синтаксиса postgresql без выполнения запроса
Я хочу проверить синтаксис файлов, содержащих sql-запросы, прежде чем они могут быть зафиксированы в моем проекте CVS.
Для этого у меня есть commitinfo script, но мне трудно узнать, действительны ли команды sql. psql
, похоже, не имеет режима сухости, и построение моего собственного теста postgresql-dialact из грамматики (то есть в источнике) кажется длинным.
Сценарии могут содержать несколько запросов, поэтому EXPLAIN
не может быть обернуто вокруг них.
Любые подсказки?
Ответы
Ответ 1
Недавно я написал утилиту для статической проверки синтаксиса 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"
Ответ 2
Один из способов заключается в том, чтобы поместить его в транзакцию, которую вы откатываете в конце:
BEGIN;
<query>;
<query>;
<query>;
ROLLBACK;
Помните, что есть некоторые эффекты, которые нельзя отменить, например, dblink вызовы или что-либо, написанное в файловой системе или увеличенное последовательности.
Я бы посоветовал клонировать вашу базу данных для целей тестирования.
Ответ 3
Я обычно использую Mimer онлайн-проверку достоверности SQL, единственное, что он проверяет синтаксис SQL для стандартного SQL:
и не является специфичным для PostgreSQL... Однако, если вы пишете код, соответствующий стандарту, вы можете его использовать, и он хорошо работает...
Ответ 4
EXPLAIN (без ANALYZE) проанализирует запрос и подготовит план выполнения, фактически не выполнив его.
https://www.postgresql.org/docs/current/static/sql-explain.html
Ответ 5
Замечательная утилита для проверки синтаксиса SQL: SQL Fiddle
Поддержка MySQL, Oracle, PostgreSQL, SQLite, MS SQL.
Ответ 6
Вы можете просто обернуть его
SELECT 1 ( <your query> ) AS a WHERE 1 = 0;
Это не будет выполнено при проверке, но это фактически не будет выполнено. Вот пример плана запроса:
Result (cost=0.00..0.01 rows=1 width=0)
One-Time Filter: false
Ответ 7
Вы можете запускать запросы как функцию 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