19

我正在寻找一种在 Node.js 应用程序中解析/标记 SQL 语句的方法,以便:

  • 标记ISO/IEC 9075标准或此处定义的所有“基本”SQL 关键字。
  • 验证 SQL 语法。
  • 找出查询将要做什么(例如读取或写入?)。

您有什么解决方案或建议窥视吗?

链接:任何 Javascript/Jquery 库来验证 SQL 语句?


我已经进行了研究,并找到了一些方法:

使用现有的 node.js 库

我进行了Google 搜索,但没有找到一个可以使用的自愿且受欢迎的库。我找到了那些:

不幸的是,这些库中没有一个是完整且值得信赖的。

基于 node.js 低级标记器库自己做

我可以使用低级标记器库自行完成,例如:

基于现有的Javascript代码美化器自己做

CodeMirror是一个非常酷的 Javascript 库(浏览器端),可以识别 SQL 关键字、字符串等。查看演示

我可以基于 CodeMirror 构建一个 node.js 库标记器。SQL 模式在github 上,我可以调整它以在节点应用程序中获取令牌。

PS:CodeMirrorgithub上有 5046 颗星,并且维护得很好。


我发现有两个不同的问题:标记化和语法验证(与标记化有关)。

我根据优秀CodeMirror的SQL 模式为自己做了一个Node.js 的SQL 分器(github 上 5,046 颗星,维护良好)。CodeMirror 的 SQL 模式负责“通用” SQL 和一些 SQL 特殊性,如MSSQLMySQLPL/SQLCassandra、 Hive 和MariaDB

当我的项目足够成熟时,我(可能)会在 GitHub 上公开并让你知道。

关于SQL 语法验证,我还没有找到 JavaScript 工具(或开源项目以适应 JS)...

4

4 回答 4

1

我最近发布了这个sql-ast包,它解析 SQL 脚本并返回一个 AST 节点数组。(我找不到任何类似的维护)

目前非常有限。我只实现了我需要的东西。如果你有时间,请贡献。我努力使代码库易于理解。

如果您有兴趣看到它进一步发展,请给它一颗星。随着图书馆的改进,我将更新这个答案。

于 2018-08-11T00:32:00.830 回答
0

祝你好运。

您没有提到哪种 SQL,但大多数生产 SQL 语言都很庞大(查看 PL/SQL 忽略 Ada 部分),复杂且不相同,因此您也必须担心方言变体。你正面临构建一个完整的 SQL 前端来做你想做的事;您发现的其他解析器的不完整性暗示了执行此操作所需的努力程度。

正确解析解析器部分后,您必须先进行符号表和类型分析(每个符号的含义),然后才能开始找出 SQL 查询读取或写入的内容(考虑确定 SELECT * from 读取的列.. ...)。

我知道那里有商业 SQL 解析器。您可以考虑使用其中之一。

于 2014-08-06T10:51:45.557 回答
0

如果您想开发自己的 SQL 解析器,我会推荐一个 PEG 设计解析器。我已经将 PEG 解析器用于 compile-to-js/compile-to-c 语言,它产生了非常清晰且易于维护的代码。检查:https ://github.com/luciotato/LiteScript

如果满足以下条件,您可以从 LiteScript 解析器开始:a) 此解析器是您应用程序的重要组成部分,b) 最终您将需要本机 exe 速度解析。

但是,如果这不是您正在开发的应用程序的重要部分,那么为现有的特定 sql 解析器做出贡献可能是最佳选择。

于 2014-08-16T20:17:18.787 回答
0

您可以查看SQLite/WebSQL JavaScript 解析器和 Jison语法文件,可用于验证工具。

现在它支持完整的 SQLite/WebSQL 语法,并且可以修改为其他 SQL 语法。

于 2015-02-16T18:58:05.547 回答