Repolode
tobymao

tobymao/sqlglot

纯 Python 编写的 SQL 解析、转译、优化与执行引擎,支持 30 多种方言互转。

Star
9,764
Fork
1,387
未关闭 Issue
13
最近提交
15小时前

这是什么?

SQLGlot 将 SQL 解析为表达式树,再生成目标方言的语句,因此可以在 DuckDB、Presto/Trino、Spark/Databricks、Snowflake、BigQuery 等方言之间互相转译。它还能格式化 SQL,尽力保留注释,并在语法错误或目标方言不支持某种写法时给出提示或报错。

除转译外,库还提供以编程方式构建和修改查询、遍历与改写语法树的 API,以及在提供 schema 信息时将查询改写为规范形式的优化器。内置的小型内存执行器可以直接在 Python 字典上运行 SQL,适合用于单元测试。用户可以通过继承或独立发布的插件包添加自定义方言。

项目不依赖任何第三方库,纯 Python 实现;另提供可选的 mypyc 编译版本(安装 sqlglot[c]),解析速度更快。

核心功能

  • 01支持 30 多种 SQL 方言之间的查询转译。
  • 02可格式化 SQL,并支持为所有标识符加引号。
  • 03语法错误会给出行号和列号。
  • 04目标方言不支持某写法时可发出警告或直接报错。
  • 05提供构建、修改和改写 SQL 语法树的 Python API。
  • 06内置查询优化器和基于 Python 字典的小型执行器。

适用场景

  • 将分析查询从一个数仓引擎(如 Snowflake、BigQuery)迁移到另一个。
  • 开发需要兼容多种数据库后端 SQL 的数据工具。
  • 分析 SQL 语句,提取其中引用的表和字段。
  • 在内存中的 Python 数据上为 SQL 逻辑编写单元测试。

快速上手

  1. 1

    从 PyPI 安装 SQLGlot

    pip3 install sqlglot
  2. 2

    在 Python 中将 Spark 查询转译为 DuckDB

    python -c "import sqlglot; print(sqlglot.transpile('SELECT EPOCH_MS(1618088028295)', read='duckdb', write='hive')[0])"

使用前须知

  • 解析器较为宽松,无效 SQL 可能被接受,只会在执行时失败。
  • 部分方言之间的转译覆盖不完整,不支持的功能会以尽力而为的方式输出并给出警告。

收录于专题

标签

常见问题

sqlglot 是什么?
纯 Python 编写的 SQL 解析、转译、优化与执行引擎,支持 30 多种方言互转。 SQLGlot 将 SQL 解析为表达式树,再生成目标方言的语句,因此可以在 DuckDB、Presto/Trino、Spark/Databricks、Snowflake、BigQuery 等方言之间互相转译。它还能格式化 SQL,尽力保留注释,并在语法错误或目标方言不支持某种写法时给出提示或报错。
sqlglot 可以免费使用吗?用的什么许可证?
sqlglot 以 MIT 许可证开源。用于商业产品前,请先确认许可证条款。
sqlglot 还在维护吗?
活跃维护中。sqlglot 最近一次提交是在 2026年11月6日。
sqlglot 适合用来做什么?
将分析查询从一个数仓引擎(如 Snowflake、BigQuery)迁移到另一个。 开发需要兼容多种数据库后端 SQL 的数据工具。 分析 SQL 语句,提取其中引用的表和字段。 在内存中的 Python 数据上为 SQL 逻辑编写单元测试。
sqlglot 怎么安装和运行?
从 PyPI 安装 SQLGlot: pip3 install sqlglot 在 Python 中将 Spark 查询转译为 DuckDB: python -c "import sqlglot; print(sqlglot.transpile('SELECT EPOCH_MS(1618088028295)', read='duckdb', write='hive')[0])"
在哪里获取 sqlglot?
源代码和安装说明在 GitHub 上:https://github.com/tobymao/sqlglot

概要由 AI 根据项目 README 生成;GitHub 数据每日更新。

相关项目