我试图解析一个SQL代码并从中提取所有的表名。
sql代码中的表名有时使用别名或schema.table或仅用表名编写。
我使用的是sqlparse包,但是我只获得表的别名,您可以在下面找到我的代码:
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
如果有人能帮我提取上面提到的所有情况下的表名,我会非常感激的。
发布于 2021-12-16 16:54:13
sqlparse不专门将identifier标记为属于列名/别名或表名/别名。因此,当出现from关键字时,您必须遍历已解析的标记并标记,然后保留后续的identifiers。
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])))输出:
[['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']]https://stackoverflow.com/questions/70382595
复制相似问题