在CVS项目中提交包含sql查询的文件之前,我想先验证它们的语法.

为了做到这一点,我有一个commitinfo脚本,但我很难确定sql命令是否有效.psql似乎没有干运行模式,从语法(在源代码中)构建我自己的postgresql dialact tester似乎需要很长时间.

脚本可能包含多个查询,因此不能用EXPLAIN来表示.

有什么提示吗?

推荐答案

我最近编写了一个实用程序,用于静态判断PostgreSQL的SQL语法.它利用用于postgres的嵌入式SQL C预处理器ecpg来判断SQL语法,因此它使用与postgres本身内置的解析器完全相同的解析器.

你可以在github上查看:http://github.com/markdrago/pgsanity.你可以浏览一下自述文件,更好地了解它的工作原理,并了解如何安装它.以下是如何使用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"

Sql相关问答推荐

Group By子句返回太多行

SQL:如何将相应位置的两个数组中的元素组合在一起

查找表中特定值的上次更新日期

正在try 从SQL获取最新的ID和一个唯一名称

SQL计数条目大于日期,包括交叉表中的零

以一致的价值获得独特的价值

TSQL如何为群分配号码

如何在多列上编写具有不同条件的查询?

如何使子查询在UPDATE语句期间获得最新更新

每个分组最多 Select 最后 2 个值并并排显示它们

将空 JSON 数组添加到 SQL Server 表列中的 JSON 字符串

SQL Server - 复杂场景 - 比较状态并填充值到后续行

PostgreSQL中如何提取以特定字符开头的字符串中的所有单词?

查询以查找今天和昨天的数据之间的差异以及伪列

如果 SQL 中不存在数据,如何根据某个 ID 为所有日期添加前一行

在给定列中具有特定值的行与 SQL 中的总行数的比率

交叉应用 OPENJSON / PIVOT - 错误的顺序

如何跨行合并以删除 SQL 中的空值?

ACCESS SQL - 有没有办法使用通配符仅 Select 字段的特定部分?

如何使用子查询锁定此查询中的选定行?