我有大量的 SQL 查询列表,全部都是字符串,它们是为Presto编写的,所以有点为 MySQL 格式化。
我希望能够梳理出一些查询中编写的表关系。
让我们从简单的事情开始:
SELECT e.object_id, count(*)
FROM schema_name.elements AS e
JOIN schema_name2.quotes AS q ON q.id = e.object_id
WHERE e.object_type = 'something'
GROUP BY e.object_id, q.query
ORDER BY 2 desc;
可以清楚地看到事物连接在一起的位置,尽管有别名 - 所以也需要扫描并找到别名 - 这很好,因为使用了关键字“AS”。
所以我想为查询返回一个关系列表,每个关系看起来像这个字典:
dict = {'SourceSchema': 'schema_name',
'SourceTable': "elements",
'SourceColumn': "object_id",
'TargetSchema': "schema_name2",
'TargetTable': "quotes",
'TargetColumn': "id"}
我可以想象这样做很容易,但事情变得更加复杂:
SELECT e.object_id, count(*)
FROM schema_name.elements e
LEFT JOIN schema_name2.quotes q ON q.id = cast(coalesce(nullif(e.object_id,''),'0') as bigint)
WHERE e.object_type = 'something'
GROUP BY e.object_id, q.query
ORDER BY 2 desc;
3个注意事项
- 缺少“AS”保留字 - 可能会使其更难获得
- 加入时,需要一起解析两个表
- 这不是一个简单的“JOIN”它是一个左连接
我想知道是否有某种形式的 Python SQL Parsing 库可以让我梳理出大约 4000 个查询中的关系?如果没有,那我怎么能有效地做到这一点?我猜我可能需要扫描查询,找到连接,找到别名,然后看看它们是如何连接的,同时考虑到一堆需要丢弃的停用词。