Найти тему
takoedelo

SQL-парсеры с открытым исходным кодом

Оглавление

Синтаксический анализ SQL-запросов предоставляет сверхспособности для мониторинга работоспособности данных. В этом посте описывается, как начать работу с синтаксическим анализом SQL для наблюдаемости данных.

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

  • Популярные таблицы и столбцы
  • Неиспользуемые таблицы и столбцы
  • Свежесть запросов

Эта статистика также помогает автоматизировать общие задачи разработки данных, такие как:

  • Резервное копирование и аварийное восстановление
  • Проблемы с качеством данных сортировки
  • Отслеживание конфиденциальных данных и способов их использования.

Проблемы и подходы

Язык SQL является стандартом ISO/IEC, а последняя версия - SQL2016. Однако каждая база данных реализует стандарт по-разному, использует разные имена функций для одной и той же операции и имеет расширения для доступа к определенным пользовательским функциям. Поэтому не существует одного SQL-парсера для диалектов всех популярных баз данных и хранилищ данных.

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

Альтернативный подход заключается в реализации грамматики SQL с использованием генераторов синтаксических анализаторов, таких как ANTLR. Существуют аналогичные генераторы парсеров с открытым исходным кодом на других популярных языках.

Существует несколько проектов, которые поддерживают парсеры для популярных баз данных с открытым исходным кодом, таких как MySQL и Postgres. Существуют платформы SQL-парсера/оптимизатора, такие как Apache Calcite, которые помогают уменьшить усилия по реализации диалекта SQL по вашему выбору.

Парсеры с открытым исходным кодом

Некоторые популярные базы данных и хранилища данных с открытым исходным кодом:

MySQL/MariaDB

  • Pingcap parser-это MySQL-парсер в Go.
  • sql-parser в phpmyadmin-это проверяющий SQL-лексер и парсер с акцентом на диалект MySQL.

Postgres

libpg_query извлекает парсер (написанный на C) из проекта postgres и упаковывает его как автономную библиотеку. Эта библиотека обернута на других языках другими проектами, такими как:

  • Python: pglast
  • Ruby : pg_query
  • Golang: pg_query_go
  • JS: psql-parser в Node и pg-query-emscripten в браузере
  • Rust: pg_query.rs

Несколько движков

  • queryparser реализует диалекты Apache Hive, Presto/Trino и Vertica.
  • zetasql реализует диалекты BigQuery, Spanner и Dataflow.

Общие парсеры

  • Python: sqlparse
  • Rust: sqlparser-rs
  • Python: mo-sql-parsing

Платформы

Платформы Parser/Optimizer реализуют общие функции языка SQL и позволяют настраивать его как первоклассную функцию платформы. Два популярных проекта с открытым исходным кодом:

  • Apache Calcite-популярный парсер/оптимизатор, который используется в популярных базах данных и механизмах запросов, таких как Apache Hive, BlazingSQL и многих других.
  • JSqlParser может анализировать несколько диалектов SQL, таких как MySQL, Postgres и Oracle. Грамматика может быть изменена для поддержки других диалектов SQL.

Apache Calcite позволяет настраивать в различных точках процесса синтаксического анализа.

  • Правила синтаксического анализатора могут быть изменены для поддержки пользовательского синтаксиса.
  • Такие соглашения, как кавычки против двойных кавычек, чувствительность к регистру.
  • Добавить правила оптимизатора.

Практические советы по началу работы

Есть много заброшенных SQL-парсеров с открытым исходным кодом. Первый фильтр-использовать проект, который будет поддерживаться в будущем. Для популярных баз данных, таких как Postgres и MySQL/MariaDB, существуют парсеры, доступные на нескольких языках программирования.

Что делать, если для вашей базы данных нет парсера?

Большинство команд не создают парсер с нуля. Популярным вариантом является использование синтаксического анализатора Postgres, а затем добавление пользовательского синтаксиса SQL. Примерами являются AWS Redshift, Vertica и DuckDB. Используйте SQL-парсер Postgres для анализа истории запросов этих баз данных для анализа большинства запросов.

Многие запросы не будут проанализированы, например, ВЫГРУЗКА в AWS Redshift. Если важно также проанализировать варианты, рассмотрите возможность изменения проектов, чтобы принять пользовательскую грамматику ИЛИ использовать платформу, такую как Apache Calcite.