首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Python解析SQL文件

用Python解析SQL文件
EN

Stack Overflow用户
提问于 2021-12-16 16:38:38
回答 1查看 211关注 0票数 1

我试图解析一个SQL代码并从中提取所有的表名。

sql代码中的表名有时使用别名或schema.table或仅用表名编写。

我使用的是sqlparse包,但是我只获得表的别名,您可以在下面找到我的代码:

代码语言:javascript
复制
SELECT  *
FROM VA_ASSISTES va, datamart_Sales.dbo.Seller f,
datamart_Sales.dbo.ARTICLES a, SITE s, datamart_Sales.dbo.TEMPS t

这就是我现在得到的结果,只有别名:

表: va,f,a,s,t

但是,我想像这样检索表名:datamart_Sales.dbo.Seller、datamart_Sales.dbo.ARTICLES、datamart_Sales.dbo.TEMPS、SITE

如果有人能帮我提取上面提到的所有情况下的表名,我会非常感激的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-16 16:54:13

sqlparse不专门将identifier标记为属于列名/别名或表名/别名。因此,当出现from关键字时,您必须遍历已解析的标记并标记,然后保留后续的identifiers

代码语言:javascript
复制
import sqlparse
s = """SELECT  *
FROM VA_ASSISTES va, datamart_Sales.dbo.Seller f,
datamart_Sales.dbo.ARTICLES a, SITE s, datamart_Sales.dbo.TEMPS t"""
s1="""SELECT job_id,AVG(salary) FROM VA_ASSISTES va, datamart_Sales.dbo.Seller f, datamart_Sales.dbo.ARTICLES a, SITE s, datamart_Sales.dbo.TEMPS t Havning job_id,AVG(salary)< (SELECT MAX(AVG(min_salary)) FROM jobs WHERE job_id IN (SELECT job_id FROM job_history WHERE department_id BETWEEN 50 AND 100) GROUP BY job_id));"""
def get_tables(p):
   f = False
   for i in p:
      if i.value.lower() == 'from':
         f = True
      if f and isinstance(i, (sqlparse.sql.Identifier, sqlparse.sql.IdentifierList)):
         if isinstance(i, sqlparse.sql.IdentifierList):
            yield from [j.value.split() for j in i.get_identifiers()]
         else:
             yield i.value.split()
         f = False
      yield from get_tables(getattr(i, '__iter__', lambda :[])())

print(list(get_tables(sqlparse.parse(s)[0])))
print(list(get_tables(sqlparse.parse(s1)[0])))

输出:

代码语言:javascript
复制
[['VA_ASSISTES', 'va'], ['datamart_Sales.dbo.Seller', 'f'], ['datamart_Sales.dbo.ARTICLES', 'a'], ['SITE', 's'], ['datamart_Sales.dbo.TEMPS', 't']]
[['VA_ASSISTES', 'va'], ['datamart_Sales.dbo.Seller', 'f'], ['datamart_Sales.dbo.ARTICLES', 'a'], ['SITE', 's'], ['datamart_Sales.dbo.TEMPS', 't'], ['jobs'], ['job_history']]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70382595

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档