Как разобрать /tokenize инструкцию SQL в Node.js

Я ищу способ разбора /tokenize инструкции SQL в приложении Node.js, чтобы:

  • Обозначить все ключевые слова SQL "основы", определенные в стандарт ISO/IEC 9075 или здесь.
  • Подтвердить синтаксис SQL.
  • Узнайте, что будет делать запрос (например, читать или писать?).

Есть ли у вас какое-либо решение или советует подглядывать?

Связано: Любая библиотека Javascript/JQuery Чтобы проверить статус SQL?


Я провел исследование, и я узнал, как это сделать:

Использование существующих библиотек Node.js

Я сделал поиск Google, и я не нашел подходящую и популярную библиотеку. Я нашел те:

  • simple-sql-parser (22 звезды на github, 16 ежедневная загрузка на npm)
    • Поддерживает только SELECT, INSERT, UPDATE и DELETE
    • Существует ветвь v2 на дороге
  • sql-parser (90 звезд на github, 6 ежедневных загрузок на npm)
    • Поддерживает только базовые операторы SELECT
    • На основе jison
  • sqljs (17 звезд на github, 5 ежедневных загрузок на npm)
    • v0.0.0-3, в разработке... Нет документации вообще:)

К сожалению, ни одна из этих библиотек не может быть полной и надежной.

Выполнение этого самостоятельно на основе библиотеки токенизатора с низким уровнем Node.js

Я могу сделать это сам с низкоуровневой библиотекой токенов, например:

  • jison (1,457 звезд на github, 240 ежедневных загрузок на npm)
  • tokenizer (44 звезды на github, 10 ежедневных загрузок на npm)

Выполнение этого на основе существующего JavaScript-кода

CodeMirror - довольно крутая библиотека Javascript (сторона браузера), которая может распознавать ключевые слова SQL, строки и т.д. Проверьте ou демо.

Я могу создать токенизатор библиотеки Node.js на основе CodeMirror. Режим SQL здесь, на github, я могу адаптировать его для получения токенов в приложении node.

PS: CodeMirror имеет 5,046 звезд на github и в хорошем состоянии.

Ответ 1

Удачи.

Вы не указали, какой SQL, но большая часть языков SQL производства огромна (проверьте PL/SQL, игнорируя часть Ada), сложная и не то же самое, поэтому вам также придется беспокоиться о вариантах диалектов. Вы сталкиваетесь с созданием полного интерфейса SQL, чтобы делать то, что вы хотите; неполнота других парсеров, которые вы нашли, - это намек на уровень усилий, который требуется для этого.

После того, как вы получите парсерную часть справа, вам нужно будет сделать таблицу символов и тип анализа (значение каждого символа), прежде чем вы сможете узнать, что читает или записывает SQL-запрос (рассмотрите определение столбцов, прочитанных SELECT * from.....).

Я понимаю, что есть коммерческие синтаксические анализаторы SQL. Вы можете использовать один из них.

Ответ 2

Если вы хотите разработать собственный синтаксический анализатор SQL, я рекомендую парсер PEG. Я использовал парсер PEG для языка компиляции к js/компиляции, что привело к значительному ясному и легкому коду. Проверьте: https://github.com/luciotato/LiteScript

Вы можете начать с парсера LiteScript, если: a) этот синтаксический анализатор является важной частью вашего приложения, b) в конечном итоге вам понадобится синтаксический анализ с использованием native-exe.

Но если это не является важной частью приложения, которое вы разрабатываете, лучшим вариантом может быть вклад в существующий специфический SQL-парсер.

Ответ 3

Вы можете посмотреть парсер SQLite/WebSQL JavaScript и грамматику Jison файл, который можно использовать для инструмента проверки.

Теперь он поддерживает полный синтаксис SQLite/WebSQL и может быть изменен для другого синтаксиса SQL.

Ответ 4

Я понял, что есть две различные проблемы: проверка токенизации и синтаксиса (что связано с токенизацией).

Я сделал себя SQL-токенизатором для Node.js на основе режима SQL отличного CodeMirror (5 046 звезд на github, в хорошем состоянии). Режим CodeMirror SQL отвечает за "общий" SQL и некоторые особенности SQL, такие как MSSQL, MySQL, PL/SQL, Cassandra, Hive и MariaDB.

Когда мой проект будет достаточно зрелым, я (вероятно) опубликую его на GitHub и дам вам знать.

О синтаксисе синтаксиса SQL, я не нашел инструмент JavaScript (или проект с открытым исходным кодом для адаптации в JS) еще...