如何parsing/标记Node.js中的SQL语句

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

  • 标记所有在ISO / IEC 9075标准或这里定义的“基本”SQL关键字。
  • validationSQL语法。
  • 找出查询要做什么(例如读或写?)。

你有任何解决scheme或build议偷看?

链接: 任何Javascript / Jquery库validationSQL的声明?


我做了研究,并find了一些方法来做到这一点:

使用现有的node.js库

我做了一个谷歌search ,我没有find一个合意和stream行的图书馆使用。 我发现那些:

  • simple-sql-parser ( github上22星,每天下载16个npm )
    • 仅支持SELECT,INSERT,UPDATE和DELETE
    • 路上有一个v2分支
  • sql-parser ( github上的90颗星, npm上每天下载6颗)
    • 只支持基本的SELECT语句
    • 基于jison
  • sqljs ( github上有17颗星, npm每天下载5颗)
    • v0.0.0-3,正在开发中…完全没有文档:)

不幸的是,这些图书馆中没有一个是完全可信的。

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

我可以用一个低级的tokenizer库来做到这一点,比如:

  • jison ( github上的1,457颗星, npm上每天下载240颗星)
  • tokenizer ( github上的44颗星, npm上每天下载10次)

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

CodeMirror是一个很酷的Javascript库(浏览器端),可以识别SQL关键字,string等。检查演示 。

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

PS: CodeMirror在github上有5046颗星,维护得很好。

祝你好运。

你没有提到哪个SQL,但是大多数生产SQL语言是巨大的(检查PL / SQL忽略了Ada部分),复杂和不一样,所以你也不必担心方言变体。 你正在构build一个完整的SQL前端来做你想做的事情; 你发现的其他parsing器的不完整性暗示了这样做的努力程度。

parsing器部分正确之后,在开始查找SQL查询读取或写入操作之前,您必须执行符号表和types分析(每个符号的含义)(请考虑确定SELECT *所读取的列..)。

我知道那里有商业SQLparsing器。 你可能会考虑使用其中的一个。

如果你想开发你自己的SQLparsing器,我会推荐一个PEGdeviseparsing器。 我已经使用了一个PEGparsing器来编译成js / compile-to-c语言,并且导致了一个非常简单明了的代码。 检查: https : //github.com/luciotato/LiteScript

如果出现以下情况,您可以从LiteScriptparsing器开始:a)parsing器是您的应用程序的重要组成部分,b)最终您需要native-exe-speedparsing。

但是,如果这不是正在开发的应用程序的重要组成部分,那么对现有特定的SQLparsing器做出贡献可能是最好的select。

您可以查看SQLite / WebSQL JavaScriptparsing器和Jison 语法文件 ,该文件可用于validation工具。

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

我发现有两个不同的问题:Tokenization和Syntaxvalidation(与标记相关)。

我根据优秀的CodeMirror的SQL模式 (github上的5046颗星,维护良好)为Node.js创build了一个SQL tokenizer 。 CodeMirror的SQL模式负责“通用”SQL和一些SQL特性,如MSSQL , MySQL , PL / SQL , Cassandra ,Hive和MariaDB 。

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

关于SQL语法validation,我没有findJavaScript工具(或者在JS中适应的开源项目)。