我正在尝试解析 sql 查询。我使用[moz-sql-parser][1]
来识别查询中的 sql 部分,然后编写一个函数来解析表名和加入的列。
我在下面有一个示例查询:
join_query2 = json.dumps(parse('''select * from tbl d
inner join jointbl1 c
on d.visit_id = c.session_id
inner join jointbl2 b
on b.sv_id = c.sv_id'''))
join_query2 = json.loads(join_query2)
当通过moz-sql-parser
收益率运行时:
{'select': '*',
'from': [{'value': 'tbl', 'name': 'd'},
{'inner join': {'name': 'c',
'value': 'jointbl1'},
'on': {'eq': ['d.visit_id', 'c.session_id']}},
{'inner join': {'name': 'b',
'value': 'jointbl2'},
'on': {'eq': ['b.sv_id', 'c.sv_id']}}]}
现在我编写了可以解析表名和列名的函数:
def parse_table_names_v2(result):
the_list = []
for x in result['from']:
try:
if 'value' in x: #returning just the main table_name
if 'name' in x:
the_list.append(x.get('name',None))
the_list.append(x.get('value'))
elif 'join' in x:
join = x['join']
if 'value' in join:
if 'name' in join:
the_list.append(join.get('name'))
the_list.append(join.get('value'))
elif 'inner join' in x:
inner_join = x['inner join']
if 'value' in inner_join:
if 'name' in inner_join:
the_list.append(inner_join.get('name'))
the_list.append(inner_join.get('value'))
except Exception as e:
print(e)
return the_list
def parse_column_names(result):
columns = []
for x in result['from']:
try:
if 'on' in x:
on = x['on']
if 'and' in on:
for x in on['and']:
if 'eq' in x:
columns.append(x['eq'])
elif 'and' not in on:
if 'eq' in on:
columns.append(on['eq'])
except Exception as e:
print(e)
return columns
它会产生 2 个列表,如下所示:
['d',
'tbl1',
'c',
'jointbl1',
'b',
'jointbl2']
和
[['d.visit_id', 'c.session_id'], ['b.sv_id', 'c.sv_id']]
但这里的诀窍是所需的输出看起来像
Row1 -> tbl1 visit_id jointbl1 session_id
Row2 -> jointbl1 sv_id jointbl2 sv_id
我的目标是解析类似的查询,我可以在其中将输出构建到数据框/列表,但很难以这种特殊的方式输出解析。任何线索将不胜感激。