如何在Node.js中解析/标记化SQL语句

时间:2014-08-06 09:16:37

标签: sql node.js parsing tokenize sql-parser

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

  • 标记所有"基础知识" SQL关键字在ISO/IEC 9075标准或here
  • 中定义
  • 验证SQL语法。
  • 找出查询将要做什么(例如读或写?)。

您有任何解决方案或建议偷看吗?

已关联:Any Javascript/Jquery Library To validate SQL statment?


我已完成研究,并找到了一些方法:

使用现有的node.js库

我做了一个Google search,但我没有找到一个可以同意使用的热门图书馆。我发现了那些:

不幸的是,这些库中没有一个是完整和可靠的。

基于node.js低级令牌化程序库

自行完成

我可以使用低级标记器库来实现自己:

根据现有的Javascript代码美化

自行完成

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

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

PS:CodeMirrorgithub上有5,046颗星,维护得很好。


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

我根据优秀SQL modeCodeMirror(github上的5,046颗星,维护得很好)为Node.js做了一个 SQL tokenizer 。 CodeMirror的SQL模式负责"泛型" SQL和一些SQL特性,如MSSQLMySQLPL/SQLCassandra,Hive和MariaDB

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

关于 SQL语法验证,我发现没有JavaScript工具(或者在JS中适应的开源项目)......

4 个答案:

答案 0 :(得分:0)

祝你好运。

你没有提到哪个SQL,但大多数生产SQL语言都很庞大(检查PL / SQL忽略了Ada部分),复杂而且不一样所以你不得不担心方言变种也是。您正在构建一个完整的SQL前端来完成您想要的任务;您找到的其他解析器的不完整性暗示了执行此操作所需的工作量。

在您将解析器部分正确后,您必须先做符号表并键入分析(每个符号的含义),然后才能开始查找SQL查询读取或写入(考虑确定SELECT *从......读取的列。)。

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

答案 1 :(得分:0)

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

如果出现以下情况,您可以从LiteScript解析器开始:a)此解析器是应用程序的重要部分,b)最终您需要进行native-exe-speed解析。

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

答案 2 :(得分:0)

您可以查看SQLite/WebSQL JavaScript parser和Jison grammar file,它们可用于验证工具。

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

答案 3 :(得分:0)

我最近发布了sql-ast程序包,该程序包解析SQL脚本并返回AST节点数组。 (我找不到所维护的类似内容)

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

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