Как разобрать / токенизировать оператор SQL в Node.js

Я ищу способ синтаксического анализа / токенизации оператора 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

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

Делать это сам на основе существующего кода Javascript

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

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

PS: CodeMirror имеет 5046 звезд на GitHub и в хорошем состоянии.


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

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

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

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

4 ответа

Я недавно опубликовал sql-astпакет, который анализирует сценарии SQL и возвращает массив узлов AST. (Я не мог найти ничего похожего, что поддерживается)

Этоочень ограничено в данный момент. Я реализовал только то, что мне нужно от него. Если у вас есть время, пожалуйста, внесите свой вклад. Я изо всех сил старался сделать кодовую базу понятной.

Дайте ему звезду, если вы заинтересованы в том, чтобы она развивалась дальше. Я буду обновлять этот ответ по мере улучшения библиотеки.

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

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

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

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

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

Удачи.

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

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

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

Другие вопросы по тегам