2009-09-08 2 views
38

Я хочу создать SQL-интерфейс поверх нереляционного хранилища данных. Нереляционное хранилище данных, но имеет смысл обращаться к данным реляционным способом.Анализ SQL с помощью Python

Я изучаю использование ANTLR для получения AST, представляющего SQL как выражение реляционной алгебры. Затем возвращайте данные путем оценки/ходьбы по дереву.

Я никогда не реализовал парсер раньше, и поэтому мне хотелось бы дать совет о том, как лучше всего реализовать парсер и оценщик SQL.

  • Описывается ли описанный выше подход правильно?
  • Есть ли другие инструменты/библиотеки, на которые я должен обратить внимание? Как PLY или Pyparsing.
  • Оценки статей, книг или исходного кода, которые помогут мне.

Update:

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

Как я уже сказал в одном из комментариев, целью упражнения было сделать доступными данные для двигателей отчетов. Для этого мне, вероятно, понадобится реализовать драйвер ODBC. Это, вероятно, много работы.

+2

Зачем налагать ограничения SQL на объекты? Что нужно получить? Что случилось с OQL? http://en.wikipedia.org/wiki/Object_Query_Language –

+7

Получено: интерфейс запросов, который может использовать огромное количество средств отчетности. Я планирую внедрить драйвер ODBC на клиенте. Чтобы бизнес-пользователи могли использовать Crystal Reports, Excel и т. Д. Для извлечения данных из хранилища данных. OQL, хотя, вероятно, хороший язык запросов (я никогда не использовал его), не так широко распространен, как SQL. – codeape

+1

+1 оба: одна из самых больших проблем с базами данных OO - это в точности отсутствие механизмов отчетности :( – van

ответ

33

Я довольно подробно рассмотрел этот вопрос. Python-sqlparse - это не проверяющий парсер, который на самом деле не нужен. Примеры в antlr требуют много работы, чтобы преобразовать в хороший ast в python. Стандартные грамматисты sql: here, но это будет полная работа, чтобы преобразовать их самостоятельно, и вполне вероятно, что вам понадобится только подмножество из них, а не объединение. Вы могли бы попробовать посмотреть на gadfly (база данных python sql), но я избегал этого, поскольку они использовали свой собственный инструмент синтаксического анализа.

Для моего случая я по существу нуждался в клаузуле where. Я попробовал booleneo (логический выражающий парсер), написанный с помощью pyparsing, но в итоге использовал pyparsing с нуля. Первая ссылка в reddit post Марка Рушакова дает пример sql, использующий ее. Whoosh полнотекстовая поисковая система также использует его, но я не смотрел источник, чтобы узнать, как это сделать.

Pyparsing очень прост в использовании, и вы можете легко настроить его, чтобы он не был точно таким же, как sql (большая часть синтаксиса вам не понадобится). Мне не нравился слой, поскольку он использует магию, используя соглашения об именах.

Короче дайте pyparsing попробовать, он, скорее всего, будет достаточно мощным, чтобы делать то, что вам нужно, и простая интеграция с python (с легкими обратными вызовами и обработкой ошибок) сделает этот процесс довольно безболезненным.

+1

Спасибо, что поделились своими впечатлениями. начальное, очень ограниченное тестирование python-sqlparse, кажется, что я могу его использовать. Я попытаюсь работать с возвращаемым значением из функции '' parse'' в python-sqlparse. Но я рассмотрю pyparsing в в любом случае. – codeape

+1

Pyparsing - хороший инструмент для этого, с большим количеством примеров разбора sql вокруг. –

+2

Этот плакат на вики-странице pyparsing (http://pyparsing.wikispaces.com/message/view/home/14105203) только что сообщил о завершении синтаксический анализатор SQL SELECT - возможно, вы могли бы связаться с ним за помощью, предложениями или даже с кодом. – PaulMcG

9

This reddit post предлагает Python-sqlparse как существующую реализацию, среди пары других ссылок.

+0

Благодарим за предложение. Python-sqlparse выглядит интересным, я дам ему попробовать. – codeape

1

Конечно, это может быть лучше использовать python-sqlparse on Google Code

UPDATE: Теперь я вижу, что это было предложено - я согласен, что это имеет смысл:

2

TwoLaid в Python SQL Parser работает очень хорошо для моих целей , Он написан на языке C и должен быть скомпилирован. Он прочен.Он анализирует отдельные элементы каждой статьи.

https://github.com/TwoLaid/python-sqlparser

Я использую его, чтобы разобрать запросов имена столбцов, чтобы использовать в заголовках отчетов. Вот пример.

import sqlparser 

def get_query_columns(sql): 
    '''Return a list of column headers from given sqls select clause''' 

    columns = [] 

    parser = sqlparser.Parser() 

    # Parser does not like new lines 
    sql2 = sql.replace('\n', ' ') 

    # Check for syntax errors 
    if parser.check_syntax(sql2) != 0: 
     raise Exception('get_query_columns: SQL invalid.') 

    stmt = parser.get_statement(0) 
    root = stmt.get_root() 
    qcolumns = root.__dict__['resultColumnList'] 
    for qcolumn in qcolumns.list: 
     if qcolumn.aliasClause: 
     alias = qcolumn.aliasClause.get_text() 
     columns.append(alias) 
     else: 
     name = qcolumn.get_text() 
     name = name.split('.')[-1] # remove table alias 
     columns.append(name) 

    return columns 

sql = ''' 
SELECT 
    a.a, 
    replace(coalesce(a.b, 'x'), 'x', 'y') as jim, 
    a.bla as sally -- some comment 
FROM 
    table_a as a 
WHERE 
    c > 20 
''' 

print get_query_columns(sql) 

# output: ['a', 'jim', 'sally'] 
Смежные вопросы