Как разобрать эти словари, кортежи внутри списка. Мне нужен четкий вывод списка с помощью PyParsing - PullRequest
2 голосов
/ 10 июня 2019

Я пытаюсь написать синтаксический анализатор SQL-запросов для некоторых команд, чтобы они отображали отношения в форме запроса в виде списка. Но я использую runTests () из PyParsing, который дает логические значения и строку вывода. Как удалить все пустые словари и кортежи из строки списка.

Я попытался напечатать имя таблицы или столбца напрямую для одного запроса, но он не печатает для этого запроса. Помогите мне напечатать вывод в списке, чтобы позже я смог получить его в CSV-файле.

Это всего лишь небольшая часть кода. Я сослался на sqlparsing из репозитория PyParsing github.

from pyparsing import *
ParserElement.enablePackrat()
delete_stmt = Forward().setName("delete statement")

LPAR,RPAR,COMMA = map(Suppress,"(),")
del_source = ((Group(database_name("database") + "." + table_name("table*")) | table_name("table*")) +
                Optional(Optional(AS) + table_alias("table_alias*")) +
                Optional(INDEXED + BY + index_name("name") | NOT + INDEXED)("index"))

delete_core = (DELETE + Optional(FROM + del_source("from*")) + Optional(WHERE + expr("where_expr")))
delete_stmt << (delete_core) 

test3="""\
    delete from abc where c=book
    """

delete_list=select_stmt.runTests(test3)
print(delete_list)

Вот что я получаю: мне нужна верхняя часть, но список печатает последнюю часть, которая является select_list, начиная с логической части.

  ['DELETE', 'FROM', 'abc', 'WHERE', ['c', '=', 'book']]

 delete from abc where c=book
 ['DELETE', 'FROM', 'abc', 'WHERE', ['c', '=', 'book']]

-from: [['abc']]
[0]:
['abc']


-table: [['abc']]
 [0]:
['abc']


-where_expr: ['c', '=', 'book']

(True, [('delete from abc where c=book', (['DELETE', 'FROM', 'abc', 
'WHERE', 
 (['c', '=', 'book'], {})], {'table': [(['abc'], {})], 'from': [(['abc'], 
 {})], 'where_expr': [(['c', '=', 'book'], {})]}))])
...