如何用正则从BigQuery视图定义中提取依赖表并生成表格?
提取视图依赖表并生成表格的正则方案
场景说明
你有多个BigQuery视图,示例视图my_project.my_dataset.my_view的定义如下:
WITH table_data AS ( SELECT * FROM `all-time-project.dataset_1.table_1` UNION ALL SELECT * FROM `all-time-project.dataset_2.table_2`) SELECT * FROM table_data
从INFORMATION_SCHEMA.VIEWS获取视图定义后,需要生成包含视图名称、依赖表名称的结构化表格。
实现步骤
1. 用正则提取依赖表
针对BigQuery视图的语法特征,我们可以用正则精准捕获SELECT/FROM/JOIN后引用的物理表(排除WITH子句中定义的临时表)。
基础正则表达式
(?:FROM|JOIN)\s`([^`]+)`(?!\sAS)
- 匹配逻辑:
(?:FROM|JOIN)\s:匹配FROM或JOIN关键字后的空格([^]+)`:捕获反引号包裹的完整表名(包含项目、数据集、表名)(?!\sAS):负向断言,排除WITH子句里的临时表定义(比如table_data AS (...)这类情况)
批量处理示例(Python)
如果需要批量处理从INFORMATION_SCHEMA.VIEWS导出的视图定义,可以用以下代码:
import re # 从INFORMATION_SCHEMA获取的视图定义文本 view_def = """WITH table_data AS ( SELECT * FROM `all-time-project.dataset_1.table_1` UNION ALL SELECT * FROM `all-time-project.dataset_2.table_2`) SELECT * FROM table_data""" # 匹配依赖表 pattern = re.compile(r"(?:FROM|JOIN)\s`([^`]+)`(?!\sAS)", re.IGNORECASE | re.DOTALL) dependent_tables = pattern.findall(view_def) # 当前视图名称 view_name = "my_project.my_dataset.my_view"
2. 生成结构化表格
将提取到的视图名和依赖表整理为Markdown表格:
| 视图名称 | 依赖表名称 |
|---|---|
my_project.my_dataset.my_view | all-time-project.dataset_1.table_1 |
my_project.my_dataset.my_view | all-time-project.dataset_2.table_2 |
扩展适配
如果视图包含更复杂的逻辑(比如嵌套子查询、多JOIN),可以调整正则以覆盖更多场景:
- 适配子查询中的表:
(?:FROM|JOIN)\s*(?:\(\s*)?([^`]+)`(?!\sAS)` - 忽略注释中的表引用:可以先预处理去掉注释,再执行匹配
内容的提问来源于stack exchange,提问作者karinayoo
相关产品推荐
相关产品推荐

