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