当前位置:   article > 正文

利用python对SQL语句进行解析_python 解析sql

python 解析sql

        在数据库管理和数据分析领域,SQL查询是一个常见的工具。有时,我们需要从SQL查询中提取表名和视图名,以便进一步的处理和分析。在本文中,将介绍如何使用Python编写代码来实现这一目标。

步骤0:环境准备

        需要利用sqlparse库和re库,本质上就是利用sqlparse的SQL语句解析功能和re正则表达式对SQL中的物理表和视图名字:

  1. pip install sqlparse
  2. pip install re

步骤1:SQL语句格式化

        首先,我们需要对SQL语句进行格式化,以确保它在解析之前具有一致的结构。这包括去除注释和不必要的空白。

  1. def format_sql(sql_content):
  2. '''将SQL语句进行规范化,并去除SQL中的注释,输入和输出均为字符串'''
  3. parse_str = sqlparse.format(sql_content.strip(), reindent=True, strip_comments=True)
  4. return parse_str

步骤2:解析SQL语句

        使用sqlparse库来解析SQL语句,然后通过正则表达式来匹配表名和视图名。以下是用于从SQL语句中提取表名和视图名的Python函数:

  1. def extract_table_names(sql_query):
  2. '''从SQL中提取表名称,输出为列表'''
  3. table_names = set()
  4. # 解析SQL语句
  5. parsed = sqlparse.parse(sql_query)
  6. # 正则表达式模式,用于匹配表名
  7. table_name_pattern = r'\bFROM\s+([^\s\(\)\,]+)|\bJOIN\s+([^\s\(\)\,]+)|(\[jntm\w+\])|(\[abc\w+\])'
  8. # 遍历解析后的语句块
  9. for statement in parsed:
  10. # 转换为字符串
  11. statement_str = str(statement).lower()
  12. # 更多处理和清理步骤
  13. # ...
  14. # 查找匹配的表名
  15. matches = re.findall(table_name_pattern, statement_str, re.IGNORECASE)
  16. for match in matches:
  17. for name in match:
  18. if name:
  19. # 处理可能包含命名空间的情况
  20. table_name = name.split('.')[-1]
  21. table_name = re.sub('("|`|\'|;)', '', table_name)
  22. table_names.add(table_name)
  23. # 更多自定义处理
  24. # ...
  25. return list(table_names)

       这里正则表达式的编写比较重要,直接影响了最后的筛选效果,我们需要主要对正则表达式进行自定义编写,单纯的使用sqlparse会导致效果非常差。

table_name_pattern = r'\bFROM\s+([^\s\(\)\,]+)|\bJOIN\s+([^\s\(\)\,]+)|(\[jntm\w+\])|(\[abc\w+\])'

步骤3:主函数体

在主函数中,我们提供一个SQL查询,并调用前面定义的函数来提取表名和视图名。然后,我们可以根据需要进一步处理和呈现结果。

  1. def main():
  2. sql_query = "SELECT IDENTITY(INT,1,1) AS id, * INTO #dbw_temp FROM [DBWComplexFunction].[dbo].[slow_sql_record] WHERE starttime = getdate()"
  3. if len(sql_query) > 10000:
  4. sql_query = sql_query[:10000]
  5. parsed_sql = format_sql(sql_query)
  6. table_names = extract_table_names(parsed_sql)
  7. # 更多自定义处理,例如表名去重
  8. # 输出结果
  9. if not table_names:
  10. table_names = 'NULL'
  11. else:
  12. table_names = ','.join(table_names)
  13. print("物理表:{}".format(table_names))
  14. if __name__ == "__main__":
  15. main()

table_names1输出的是符合条件的所有物理表名和视图名的集合,这里需要自己写一个对照程序,用于对照那些是视图那些是物理表

EASY~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/540985
推荐阅读
相关标签
  

闽ICP备14008679号