SQLGlot:用SQLGlot解析SQL

几十年来,结构化查询语言(SQL)一直是与数据库交互的实际语言。在一段时间内,不同的数据库在支持通用SQL语法的同时演变出了不同的SQL风格,也就是方言。这可能是SQL被广泛采用和流行的原因之一。

SQL解析是解构SQL查询以提取不同信息的过程,如字段、表、过滤器、连接等。查询解析主要由优化器组件在所有数据库后端中使用,以了解如何优化查询以进行处理。数据库优化器查询解析的细节超出了本文的讨论范围。我们在这里的目的是了解SQL解析的各种用例(在数据库引擎之外),并探索SQLGlot如何提供帮助。

SQLGlot介绍

来自官方文档:SQLGlot是一个无依赖性SQL解析器、转译器、优化器和引擎。

这支持:

  • SQL格式化
  • 20种不同的方言
  • 方言转换
  • 自定义解析器实现
  • 查询分析
  • 还有更多……

我使用这个包进行SQL解析,从给定的SQL查询中提取信息。我尝试了其他软件包,如sqlparse,发现sqlglot更好。
在这里插入图片描述

SQL解析应用场景

→数据健康监控/数据可观察性:分析数据库查询历史,提取使用频次高的表和列、未使用表和列、以及表之间关系等信息。

→方言翻译:SQL解析通常产生一个AST(抽象语法树)输出,该输出与数据库无关,可用于将给定查询翻译为不同的SQL方言。

→数据目录:SQL 解析器可用于通过提取诸如特定表上运行的常见查询、用户/组对表的使用情况、查询模式等信息来填充数据目录,从而提高数据集的可发现性。数据目录是一个集中化的元数据存储系统,用于管理和描述组织内的各种数据资产(如数据库表、文件、API等)。它的主要目的是帮助数据使用者(如数据分析师、数据科学家)快速找到和理解他们需要的数据。

→业务规则提取和文档:提取业务规则,ETL转换等,可用于自动生成这些规则的文档,帮助自助数据发现和分析。

→SQL可视化和优化:查询树的快速分析有助于识别执行SQL中的问题和反模式。这对于没有经验的用户/SQL生成工具(如BI可视化工具中可用的那些)生成错误的SQL查询特别有用。

→SQL格式化:可能是SQL解析器最常见的用例。有助于格式化SQL查询的可读性和确定优化的领域。

SQL解析简单示例

从任何给定的SQL中提取表名、数据库名:

from sqlglot import parse_one, expquery = """
SELECT
col1
,col2
,col3
FROM db1.table1
"""
for table in parse_one(query).find_all(exp.Table):print(f"Table => {table.name} | DB => {table.db}")

从任何给定的SQL中提取表名、数据库名:

from sqlglot import parse_one, exp
query = """
SELECT
col1
,col2
,col3
FROM db1.table1
"""
for column in parse_one(query).find_all(exp.Column):print(f"Column => {column.name}")

查找CTE到表的关系(在构建血缘关系/查询DAG时可能很有用):

query = """
with tab1 as
(select a,b from db1.table1
)
,tab2 as
(select a from tab1
)
,tab3 as
(selectt1.a,t2.bfrom tab1 t1join tab2 t2on t1.a = t2.a
)
select
*
from tab3
"""dependencies = {}for cte in parse_one(query).find_all(exp.CTE):dependencies[cte.alias_or_name] = []cte_query = cte.this.sql()for table in parse_one(cte_query).find_all(exp.Table):dependencies[cte.alias_or_name].append(table.name)
print(dependencies)-- Output: {'tab1': ['table1'], 'tab2': ['tab1'], 'tab3': ['tab1', 'tab2']}

SQLGlot详细示例

  • 数据库迁移

当应用从一个数据库系统迁移到另一个数据库系统时,通常需要将现有的 SQL 查询语句转换为目标数据库系统的语法。SQLGlot 可以帮助简化这个过程,使得迁移过程更加顺利。

import sqlglot
sql = "SELECT EPOCH_MS(1618088028295)"
transformed_sql = sqlglot.transpile(sql, read="duckdb", write="hive")[0]
print(transformed_sql)
# 输出: SELECT FROM_UNIXTIME(1618088028295 / 1000)
  • 跨平台开发

在跨平台开发中,不同的平台可能使用不同的数据库系统。SQLGlot 可以帮助开发人员编写一次 SQL 查询语句,然后通过转换功能将其适配到不同的数据库系统上,从而减少重复工作。

import sqlglot
sql = "SELECT * FROM users WHERE age > 30 AND city = 'New York'"
transformed_sql_mysql = sqlglot.transpile(sql, dialect="mysql")[0]
transformed_sql_postgresql = sqlglot.transpile(sql, dialect="postgresql")[0]
print("转换为MySQL语法:", transformed_sql_mysql)
print("转换为PostgreSQL语法:", transformed_sql_postgresql)
  • 数据库查询工具

一些数据库查询工具可能需要支持多种数据库系统,而用户可能希望在不同数据库系统上执行相同的查询。SQLGlot 可以帮助这些工具实现跨数据库的查询支持。

import sqlglot
sql = "SELECT * FROM users WHERE age > 30 AND city = 'New York'"
transformed_sql = sqlglot.transpile(sql, dialect="bigquery")[0]
print(transformed_sql)
  • SQL 语句优化

在数据库开发中,经常会遇到需要优化的查询语句。SQLGlot 可以帮助开发者重写查询语句,优化查询逻辑和执行计划,提高查询效率。

from sqlglot import optimize
sql = "SELECT * FROM users WHERE age > 30 AND city = 'New York'"
optimized_sql = optimize(sql)
print(optimized_sql)
  • 索引优化建议

SQLGlot 可以分析查询语句中的索引使用情况,提出索引优化建议,帮助开发者优化数据库表结构和索引设计。

from sqlglot import index_suggestions
sql = "SELECT * FROM users WHERE age > 30 AND city = 'New York'"
index_suggestions = index_suggestions(sql)
print(index_suggestions)
  • 实时数据分析

SQLGlot 可以结合实时数据流处理框架(如 Apache Kafka、Apache Flink 等),实现实时数据分析和处理,满足大规模数据处理和分析的需求。

from sqlglot import transform
sql = "SELECT * FROM streaming_data WHERE value > 100"
transformed_sql = transform(sql)
print(transformed_sql)
  • 数据血缘分析

通过解析 SQL 查询,SQLGlot 可以提取表和字段级别的信息,帮助构建数据血缘图,了解数据的来源和流向。

from sqlglot import parse_one, exp
query = """
SELECT col1, col2, col3
FROM db1.table1
"""
for table in parse_one(query).find_all(exp.Table):print(f"Table => {table.name} | DB => {table.db}")
for column in parse_one(query).find_all(exp.Column):print(f"Column => {column.name}")
  • 复杂查询解析

SQLGlot 可以解析复杂的查询,包括 CTE(Common Table Expressions)和多表连接查询,帮助开发者理解和优化这些查询。

from sqlglot import parse_one, exp
query = """
WITH tab1 AS (SELECT a, b FROM db1.table1
),
tab2 AS (SELECT a FROM tab1
),
tab3 AS (SELECT t1.a, t2.bFROM tab1 t1JOIN tab2 t2 ON t1.a = t2.a
)
SELECT * FROM tab3
"""
dependencies = {}
for cte in parse_one(query).find_all(exp.CTE):dependencies[cte.alias_or_name] = []cte_query = cte.this.sql()for table in parse_one(cte_query).find_all(exp.Table):dependencies[cte.alias_or_name].append(table.name)
print(dependencies)

SQLGlot 官方文档

有关SQL格式、方言翻译、查询验证的其他示例,请参阅官方文档。(链接如下)。

SQLGlot Official Documentations

  • API documentation
  • Official Github

最后总结

SQLGlot 是一个功能强大的工具,适用于多种数据库开发和数据分析场景。它不仅支持 SQL 语句的解析、转换和优化,还能够帮助开发者进行数据血缘分析、索引优化和实时数据分析。通过这些功能,SQLGlot 可以显著提高开发效率,优化数据库操作,并支持跨数据库的兼容性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/69000.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Docker项目实战】使用Docker部署MinIO对象存储(详细教程)

【Docker项目实战】使用Docker部署MinIO对象存储 前言一、 MinIO介绍1.1 MinIO简介1.2 主要特点1.3 主要使用场景二、本次实践规划2.1 本地环境规划2.2 本次实践介绍三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本四、下载MinIO镜像五、…

webrtc编译需要常用环境变量以及相关名词解释

set vs2022_installD:\\vs2022 set GYP_MSVS_OVERRIDE_PATHD:\\vs2022 set GYP_GENERATORSmsvs-ninja,ninja set WINDOWSSDKDIRD:\\Windows Kits\10 set DEPOT_TOOLS_WIN_TOOLCHAIN0 set GYP_MSVS_VERSION2022 这些环境变量是为了编译 WebRTC 时让 GYP/Depot Tools 正确找到 V…

Windows程序设计10:文件指针及目录的创建与删除

文章目录 前言一、文件指针是什么?二、设置文件指针的位置:随机读写,SetFilePointer函数1.函数说明2.函数实例 三、 目录的创建CreateDirectory四、目录的删除RemoveDirectory总结 前言 Windows程序设计10:文件指针及目录的创建与…

线程互斥同步

前言: 简单回顾一下上文所学,上文我们最重要核心的工作就是介绍了我们线程自己的LWP和tid究竟是个什么,总结一句话,就是tid是用户视角下所认为的概念,因为在Linux系统中,从来没有线程这一说法,…

DRM系列七:Drm之CREATE_DUMB

本系列文章基于linux 5.15 DRM驱动的显存由GEM(Graphics execution management)管理。 一、创建流程 创建buf时,user层提供需要buf的width,height以及bpp(bite per pixel),然后调用drmIoctl(fd, DRM_IOCTL_MODE_CREATE_DUMB, &…

我们信仰AI?从神明到人工智能——信任的进化

信任的进化: 信任是我们最宝贵的资产。而现在,它正像黑色星期五促销的廉价平板电视一样,被一点点拆解。在过去,世界很简单:人们相信晚间新闻、那些满是灰尘书籍的教授,或者手持病历、眉头紧锁的医生。而如…

数据分析系列--[11] RapidMiner,K-Means聚类分析(含数据集)

一、数据集 二、导入数据 三、K-Means聚类 数据说明:提供一组数据,含体重、胆固醇、性别。 分析目标:找到这组数据中需要治疗的群体供后续使用。 一、数据集 点击下载数据集 二、导入数据 三、K-Means聚类 Ending, congratulations, youre done.

1-刷力扣问题记录

25.1.19 1.size()和.length()有什么区别 2.result.push_back({nums[i], nums[left], nums[right]});为什么用大括号? 使用大括号 {} 是 C11 引入的 初始化列表 语法,它允许我们在构造或初始化对象时直接传入一组值。大括号的使用在许多情况下都能让代码…

信息学奥赛一本通 2113:【24CSPJ普及组】小木棍(sticks) | 洛谷 P11229 [CSP-J 2024] 小木棍

【题目链接】 ybt 2113:【24CSPJ普及组】小木棍(sticks) 洛谷 P11229 [CSP-J 2024] 小木棍 【题目考点】 1. 思维题,找规律 【解题思路】 解法1:找规律 该题为:求n根木棍组成的无前导0的所有可能的数…

神经网络参数量和运算量的计算- 基于deepspeed库和thop库函数

引言 最近需要对神经网络的参数量和运算量进行统计。找到一个基于deepspeed库函数计算参数量和运算量的例子。而我之前一直用thop库函数来计算。 看到有一篇勘误博文写道使用thops库得到的运算量是MACs (Multiply ACcumulate operations,乘加累积操作次数&#xf…

读书笔记--分布式架构的异步化和缓存技术原理及应用场景

本篇是在上一篇的基础上,主要对分布式应用架构下的异步化机制和缓存技术进行学习,主要记录和思考如下,供大家学习参考。大家知道原来传统的单一WAR应用中,由于所有数据都在同一个数据库中,因此事务问题一般借助数据库事…

postgresql的用户、数据库和表

在 PostgreSQL 中,用户、数据库和表是关系型数据库系统的基本组成部分。理解这些概念对数据库管理和操作至关重要。下面是对这些概念的详细解释: 1. 用户(User) 在 PostgreSQL 中,用户(也称为 角色&#…

360大数据面试题及参考答案

数据清理有哪些方法? 数据清理是指发现并纠正数据文件中可识别的错误,包括检查数据一致性,处理无效值和缺失值等。常见的数据清理方法有以下几种: 去重处理:数据中可能存在重复的记录,这不仅会占用存储空间,还可能影响分析结果。通过对比每条记录的关键属性,若所有关键…

无用知识研究:std::initializer_list的秘密

先说结论,用std::initializer_list初始化vector,内部逻辑是先生成了一个临时数组,进行了拷贝构造,然后用这个数组的起终指针初始化initializer_list。然后再用initializer_list对vector进行初始化,这个动作又触发了拷贝…

代码随想录day27

669. /** lc appleetcode.cn id669 langcpp** [669] 修剪二叉搜索树*/// lc codestart /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}…

基于JMX实现消息队列监控

引言 实时监控中间件保障集群的可用性是极其重要的&#xff0c;本篇文章以JAVA语音基于JMX来实现对Kafka消息队列的监控 实现 添加依赖 在 pom.xml 中添加以下依赖&#xff1a; <dependencies><!-- Kafka 客户端依赖 --><dependency><groupId>org…

.Net Core笔记知识点(跨域、缓存)

设置前端跨域配置示例&#xff1a; builder.Services.AddCors(option > {option.AddDefaultPolicy(policy > {policy.WithOrigins(originUrls).AllowAnyMethod().AllowAnyHeader().AllowCredentials();});});var app builder.Build();app.UseCors(); 【客户端缓存】接…

Jupyterlab和notebook修改文件的默认存放路径的方法

文章目录 1.缘由2.操作流程2.1找到默认的路径2.2创建配置文件2.3修改配置文件内容2.4注意事项 1.缘由 我自己使用jupyterlab的时候&#xff0c;打开是在这个浏览器上面打开的&#xff0c;但是这个打开的文件路径显示的是C盘上面路径&#xff0c;所以这个就很麻烦&#xff0c;因…

HarmonyOS:ArkWeb进程

ArkWeb是多进程模型,分为应用进程、Web渲染进程、Web GPU进程、Web孵化进程和Foundation进程。 说明 Web内核没有明确的内存大小申请约束,理论上可以无限大,直到被资源管理释放。 ArkWeb进程模型图 应用进程中Web相关线程(应用唯一) 应用进程为主进程。包含网络线程、Vi…

基于Spring Security 6的OAuth2 系列之九 - 授权服务器--token的获取

之所以想写这一系列&#xff0c;是因为之前工作过程中使用Spring Security OAuth2搭建了网关和授权服务器&#xff0c;但当时基于spring-boot 2.3.x&#xff0c;其默认的Spring Security是5.3.x。之后新项目升级到了spring-boot 3.3.0&#xff0c;结果一看Spring Security也升级…