不运行查询的PostgreSQL语法检查

oxcyiej7  于 2023-04-29  发布在  PostgreSQL
关注(0)|答案(8)|浏览(140)

我想验证包含sql查询的文件的语法,然后才能将它们提交到CVS项目中。
为了做到这一点,我有一个commitinfo脚本,但我很难发现sql命令是否有效。psql似乎没有dryrun模式,从语法(源代码中)构建我自己的postgresql-dialact测试器似乎是一个漫长的过程。
这些脚本可能包含多个查询,因此EXPLAIN不能 Package 它们。
有什么提示吗?

nkoocmlb

nkoocmlb1#

你可以把它 Package 成SELECT 1 ( <your query> ) AS a WHERE 1 = 0;
它会在验证时失败,但实际上不会执行。下面是一个示例查询计划:

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

igsr9ssn2#

你可以在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的下一个化身

ujv3wf0j

ujv3wf0j3#

我最近写了一个实用程序来静态检查PostgreSQL的SQL语法。它利用ecpg(postgres的嵌入式SQL C预处理器)来检查SQL语法,因此它使用与Postgres本身内置的完全相同的解析器。
你可以在github上查看:您可以给予一下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"
7eumitmz

7eumitmz4#

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

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

函数is_sql(sql text)(链接到我的GitHub)

cx6n0qe3

cx6n0qe35#

一种方法是将其放入一个事务中,并在最后回滚:

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

请注意,有些效果是不能回滚的,比如dblink调用,或者写入文件系统或递增序列的任何内容。
我建议克隆你的数据库以供测试。

jrcvhitl

jrcvhitl6#

EXPLAIN(不带ANALYZE)将解析查询并准备执行计划,而不实际执行它。
https://www.postgresql.org/docs/current/static/sql-explain.html

xfb7svmp

xfb7svmp7#

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

  • SQL-92语言
  • SQL-99
  • SQL-03

而不是PostgreSQL专用的。..但是,如果你按照标准编写代码,你可以使用它,它工作得很好。..

bvjxkvbb

bvjxkvbb8#

一个很棒的实用程序来验证SQL语法:SQL Fiddle
支持MySQL,Oracle,PostgreSQL,SQLite,MS SQL。

相关问题