Анализатор операторов выбора SQL не возвращает тип JOIN ⇐ Python
-
Anonymous
Анализатор операторов выбора SQL не возвращает тип JOIN
Я хочу проанализировать оператор SQL Select, который имеет все функции обычного диалекта SQL, такого как MySQL. Я искал библиотеки синтаксического анализа в Python, но не смог найти ту, которая выполняла бы эту работу. Под этим я подразумеваю, что нашел несколько библиотек синтаксического анализа, но они могли анализировать только базовые операторы выбора (FROM и WHERE, даже не ORDER BY). Поэтому в качестве альтернативы я сделал свой собственный парсер (который, как я знаю, совсем не лучшее решение). Я потратил несколько часов на работу над этим, но постоянно получаю странную ошибку и не знаю, как с ней справиться. Прежде чем я покажу код, я просто хочу упомянуть, что если вы знаете библиотеку Python, которая может анализировать операторы SQL, а не только SELECT, но также CREATE TABLE, INSERT и т. д., дайте мне знать.
Вот строка грамматики моего языка:
select_grammar = """ начало: select_statement ";" select_statement: "SELECT" columns_list "FROM" table_list join_list? где_предложение? групповое_предложение? наличие_предложения? orderby_clause? список_колонок: "*" | выражение_столбца ("," выражение_столбца)* столбец_выражение: function_call | имя_столбца | подзапрос имя_столбца: (имя_таблицы ".")? ИМЯ («КАК» ИМЯ)? имя_таблицы: ИМЯ («КАК» ИМЯ)? function_call: NAME "(" function_args ")" ("AS" NAME)? function_args: выражение ("," выражение)* where_clause: условие «ГДЕ» groupby_clause: "GROUP BY" столбец_выражение ("," столбец_выражение)* has_clause: "HAVING" логическое_выражение orderby_clause: "ORDER BY" order_column ("," order_column)* столбец_заказа: выражение_столбца ["ASC" | "DESC"]? условие: логическое_выражение логическое_выражение: логический_терм | логическое_выражение "И" логический_терм | логическое_выражение "ИЛИ" логический_терм | «НЕ» логический_терм логический_терм: сравнение_выражение | "(" логическое_выражение ")" | подзапрос сравнение_выражение: выражение выражение ОПЕРАТОРА | выражение "IS" ("NULL" | "NOT NULL") выражение: (имя_таблицы ".")? ИМЯ | ИНТ | строка | вызов_функции | подзапрос список_таблиц: имя_таблицы ("," имя_таблицы)* | подзапрос подзапрос: "(" select_statement ")" join_list: join_expr+ join_expr: join_type (имя_таблицы | подзапрос) условие «ВКЛ.» join_type: "ВНУТРЕННЕЕ СОЕДИНЕНИЕ" | «ЛЕВОЕ СОЕДИНЕНИЕ» | «ПРАВОЕ ПРИСОЕДИНЕНИЕ» | «ПОЛНОЕ ПРИСОЕДИНЕНИЕ» строка: ESCAPED_STRING | /'[^']*'/ ОПЕРАТОР: «>» | "=" | "
Я хочу проанализировать оператор SQL Select, который имеет все функции обычного диалекта SQL, такого как MySQL. Я искал библиотеки синтаксического анализа в Python, но не смог найти ту, которая выполняла бы эту работу. Под этим я подразумеваю, что нашел несколько библиотек синтаксического анализа, но они могли анализировать только базовые операторы выбора (FROM и WHERE, даже не ORDER BY). Поэтому в качестве альтернативы я сделал свой собственный парсер (который, как я знаю, совсем не лучшее решение). Я потратил несколько часов на работу над этим, но постоянно получаю странную ошибку и не знаю, как с ней справиться. Прежде чем я покажу код, я просто хочу упомянуть, что если вы знаете библиотеку Python, которая может анализировать операторы SQL, а не только SELECT, но также CREATE TABLE, INSERT и т. д., дайте мне знать.
Вот строка грамматики моего языка:
select_grammar = """ начало: select_statement ";" select_statement: "SELECT" columns_list "FROM" table_list join_list? где_предложение? групповое_предложение? наличие_предложения? orderby_clause? список_колонок: "*" | выражение_столбца ("," выражение_столбца)* столбец_выражение: function_call | имя_столбца | подзапрос имя_столбца: (имя_таблицы ".")? ИМЯ («КАК» ИМЯ)? имя_таблицы: ИМЯ («КАК» ИМЯ)? function_call: NAME "(" function_args ")" ("AS" NAME)? function_args: выражение ("," выражение)* where_clause: условие «ГДЕ» groupby_clause: "GROUP BY" столбец_выражение ("," столбец_выражение)* has_clause: "HAVING" логическое_выражение orderby_clause: "ORDER BY" order_column ("," order_column)* столбец_заказа: выражение_столбца ["ASC" | "DESC"]? условие: логическое_выражение логическое_выражение: логический_терм | логическое_выражение "И" логический_терм | логическое_выражение "ИЛИ" логический_терм | «НЕ» логический_терм логический_терм: сравнение_выражение | "(" логическое_выражение ")" | подзапрос сравнение_выражение: выражение выражение ОПЕРАТОРА | выражение "IS" ("NULL" | "NOT NULL") выражение: (имя_таблицы ".")? ИМЯ | ИНТ | строка | вызов_функции | подзапрос список_таблиц: имя_таблицы ("," имя_таблицы)* | подзапрос подзапрос: "(" select_statement ")" join_list: join_expr+ join_expr: join_type (имя_таблицы | подзапрос) условие «ВКЛ.» join_type: "ВНУТРЕННЕЕ СОЕДИНЕНИЕ" | «ЛЕВОЕ СОЕДИНЕНИЕ» | «ПРАВОЕ ПРИСОЕДИНЕНИЕ» | «ПОЛНОЕ ПРИСОЕДИНЕНИЕ» строка: ESCAPED_STRING | /'[^']*'/ ОПЕРАТОР: «>» | "=" | "
Мобильная версия