在数据库管理和数据分析领域,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语句传递给数据库进行查询和执行。