web-dev-qa-db-ja.com

Node.jsでSQLステートメントを解析/トークン化する方法

Node.jsアプリケーション内でSQLステートメントを解析/トークン化する方法を探しています。

  • ISO/IEC 9075 標準または ここ で定義されているすべての「基本」SQLキーワードをトークン化します。
  • SQL構文を検証します。
  • クエリが何をするのかを調べます(例:読み取りまたは書き込み?)。

何か解決策がありますか、または覗き見をアドバイスしますか?

リンク: SQLステートメントを検証するためのJavascript/Jqueryライブラリ?


私は調査を行い、それを行うためのいくつかの方法を見つけました。

既存のnode.jsライブラリを使用する

Google検索 を実行しましたが、使用するコンセンサスで人気のあるライブラリが見つかりませんでした。私はそれらのものを見つけました:

  • simple-sql-parsergithub に22の星、 npm )[.____に毎日16のダウンロード。]
    • SELECT、INSERT、UPDATE、およびDELETEのみをサポートします
    • v2ブランチ 道路上にあります
  • sql-parser (90つ星 github 、毎日6回ダウンロード npm
    • 基本的なSELECTステートメントのみをサポートします
    • jison に基づく
  • sqljsgithub に17つ星、 npm )[.____に毎日5回ダウンロード]
    • v0.0.0-3、開発中...ドキュメントはまったくありません:)

残念ながら、これらのライブラリはどれも完全で信頼できるものではありません。

node.js低レベルトークナイザーライブラリに基づいて自分で行う

次のような低レベルのトークナイザーライブラリを使用して、自分でそれを行うことができます。

既存のJavascriptコードビューティファイアに基づいて自分で行う

CodeMirror は、SQLキーワード、文字列などを認識できる非常に優れたJavascriptライブラリ(ブラウザ側)です。 デモ を確認してください。

CodeMirrorに基づいてnode.jsライブラリトークナイザーを構築できます。 SQLモードはgithubにあります 、ノードアプリケーション内でトークンを取得するように適応させることができます。

PS: CodeMirrorgithub に5,046の星があり、よく維持されています。


トークン化と構文検証(トークン化に関連する)の​​2つの明確な問題があることがわかりました。

優れた CodeMirrorSQLモード に基づいて、Node.js用のSQLトークナイザーを作成しました=(githubの5,046の星、手入れの行き届いた)。 CodeMirrorのSQLモードは、「汎用」SQLと、 [〜#〜] mssql [〜#〜]MySQLPL/SQL)などのSQLの特殊性を担当します。Cassandra 、Hiveおよび MariaDB

私のプロジェクトが十分に成熟したら、(おそらく)GitHubで公開し、お知らせします。

SQL構文の検証について、JavaScriptツール(またはJSに適応するオープンソースプロジェクト)はまだ見つかりませんでした...

18
Yves M.

最近公開しました sql-ast パッケージ。SQLスクリプトを解析し、ASTノードの配列を返します。(維持されている類似のものは見つかりませんでした)

現時点では非常に制限されています。私はそれから必要なものだけを実装しました。時間があれば、貢献してください。私はコードベースを理解できるようにするために一生懸命努力しました。

それがさらに発展するのを見ることに興味があるなら、それに星を付けてください。ライブラリが改善されたら、この回答を更新します。

1
aleclarson

幸運を。

どのSQLについては言及していませんが、ほとんどの本番SQL言語は巨大で(Adaの部分を無視してPL/SQLをチェックしてください)、複雑で同じではないため、方言のバリエーションについても心配する必要があります。あなたはあなたが望むことをするために完全なSQLフロントエンドを構築することに直面しています。あなたが見つけた他のパーサーの不完全さは、これを行うために必要な努力のレベルについてのヒントです。

parserの部分を正しく取得したら、SQLクエリが何を読み書きするかを調べる前に、シンボルテーブルとタイプ分析(すべてのシンボルの意味)を実行する必要があります(検討してください)。 SELECT *によって読み取られた列を........から決定します。

市販のSQLパーサーがあることを理解しています。それらの1つを使用することを検討してください。

0
Ira Baxter

独自のSQLパーサーを開発する場合は、PEGデザインパーサーをお勧めします。 compile-to-js/compile-to-c言語にPEGパーサーを使用しましたが、その結果、コードを非常に明確で管理しやすくなりました。チェック: https://github.com/luciotato/LiteScript

次の場合は、LiteScriptパーサーから開始できます。a)このパーサーがアプリケーションの重要な部分である場合、b)最終的にnative-exe-speed解析が必要になる場合。

ただし、これが開発中のアプリケーションの重要な部分ではない場合は、既存の特定のSQLパーサーに貢献することが最善の選択である可能性があります。

0
Lucio M. Tato

SQLite/WebSQL JavaScriptパーサー とJison 文法ファイル を見ることができます。これらは検証ツールに使用できます。

現在は完全なSQLite/WebSQL構文をサポートしており、他のSQL構文用に変更できます。

0
agershun