PostgreSQL语法检查而不运行查询

时间:2011-11-25 16:06:31

标签: sql parsing postgresql syntax cvs

我想验证包含sql查询的文件的语法,然后才能在我的CVS项目中提交它们。

为了做到这一点,我有一个commitinfo脚本,但我很难找到sql命令是否有效。 psql似乎没有干运行模式,并且从语法(在源代码中)构建我自己的postgresql-dialact测试器似乎是一个很长的延伸。

脚本可能包含多个查询,因此EXPLAIN不能包含它们。

任何提示?

8 个答案:

答案 0 :(得分:41)

我最近编写了一个实用程序来静态检查PostgreSQL的SQL语法。它利用ecpg(postgres的嵌入式SQL C预处理程序)来检查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"

答案 1 :(得分:16)

使用此技巧来验证PostgreSQL代码语法:

DO $SYNTAX_CHECK$ BEGIN RETURN;
    -- insert your SQL code here
END; $SYNTAX_CHECK$;

答案 2 :(得分:13)

一种方法是将其放入最后回滚的交易中:

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

请注意,有些效果无法回滚,例如dblink调用,或者写入文件系统或增加序列的任何内容。

我建议克隆您的数据库以进行测试。

答案 3 :(得分:6)

我通常使用Mimer online SQL validator,唯一的问题是它检查标准SQL的SQL语法:

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

并不是特定于PostgreSQL ...但是如果您按照标准编写代码,您可以使用它并且它可以正常运行...

答案 4 :(得分:6)

EXPLAIN(没有ANALYZE)将解析查询并准备执行计划,而不实际执行它。

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

答案 5 :(得分:3)

验证SQL语法的精彩实用程序:SQL Fiddle

支持MySQL,Oracle,PostgreSQL,SQLite,MS SQL。

答案 6 :(得分:1)

你可以把它包起来 SELECT 1 ( <your query> ) AS a WHERE 1 = 0;

它在验证时失败但它实际上不会执行。这是一个示例查询计划:

Result  (cost=0.00..0.01 rows=1 width=0)
  One-Time Filter: false

答案 7 :(得分:1)

你可以运行查询iside 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扩展(on github),pgpsql_lint的下一个版本