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

步骤0:环境准备

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

pip install sqlparse
pip install re

步骤1:SQL语句格式化

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

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

步骤2:解析SQL语句

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

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

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

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

步骤3:主函数体

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

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

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

EASY~

这篇文档介绍了如何使用Python中的sqlparse和re库来解析SQL语句,以便自动提取其中的物理表名和视图名。主要步骤包括SQL格式化、编写自定义正则表达式、以及提取和处理表名和视图名。这个方法可以在需要自动化处理SQL查询时提供便利,允许用户有效地识别和操作其中的表名和视图名。 import pandas as pd from sqlalchemy import create_engine warnings.filterwarnings('ignore') DB_USERNAME = '' DB_PASSWORD = '' DB_HOST = '' DB_PORT = '3306' DB_NAME = 'information_schema' DB_URI = 'mysql+pymy. # 解析配置文件 table_name = config.get('query', 'table_name') start_date = config.get('query', 'start_date') end_date = config.get('query', 'end_date') # 生成SQL语句 sql = f"SELECT * FROM {table_name} WHERE date BETWEEN '{start_date}' AND '{end_date}'" print(sql) 在这个例子中,首先使用Python的configparser库读取一个配置文件,该配置文件包含了需要查询的表名、起始日期和结束日期等信息。然后,使用configparser库解析配置文件,并使用字符串格式化生成SQL语句。最后,输出生成的SQL语句。 在实际情况中,你需要根据具体的查询需求和配置文件格式进行调整和修改。同时,你还需要考虑如何将生成的SQL语句传递给数据库进行查询和执行。