TwoLaid的Python SQL解析器对于我的目的来说非常好用。 它是用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
replace(coalesce(a.b, 'x'), 'x', 'y') as jim,
a.bla as sally -- some comment
table_a as a
WHERE
print get_query_columns(sql)
# output: ['a', 'jim', 'sally']