首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【翻译】sqlglot库的使用

【翻译】sqlglot库的使用

作者头像
保持热爱奔赴山海
发布2025-09-11 15:28:13
发布2025-09-11 15:28:13
260
举报
文章被收录于专栏:数据库相关数据库相关

项目地址 https://github.com/tobymao/sqlglot

SQLGlot 是一个无依赖的 SQL 解析器、转译器、优化器和引擎。它可用于格式化 SQL 或在 30 种不同的方言之间进行翻译,例如 DuckDB、Presto / Trino、Spark / Databricks、Snowflake 和 BigQuery。它旨在读取各种 SQL 输入,并在目标方言中以语法和语义正确输出 SQL。

它是一个非常全面的通用 SQL 解析器,具有强大的测试套件。它的性能也相当高,同时纯粹是用 Python 编写的。

您可以轻松自定义解析器、分析查询、遍历表达式树以及以编程方式构建 SQL。

SQLGlot 可以检测各种语法错误,例如不平衡的括号、保留关键字的错误使用等。这些错误会突出显示,并且方言不兼容可能会根据配置发出警告或引发。

安装

代码语言:txt
复制
pip3 install "sqlglot[rs]"

# Without Rust tokenizer (slower):
# pip3 install sqlglot

例子

代码语言:txt
复制
1、【最常用】轻松从一种方言翻译成另一种方言。例如,日期/时间函数因方言而异,可能难以处理:
import sqlglot
sqlglot.transpile("SELECT EPOCH_MS(1618088028295)", read="duckdb", write="hive")[0]



2、SQLGlot 甚至可以翻译自定义时间格式:
import sqlglot
sqlglot.transpile("SELECT STRFTIME(x, '%y-%-m-%S')", read="duckdb", write="hive")[0]


3、标识符分隔符和数据类型也可以转换:
import sqlglot

# Spark SQL requires backticks (`) for delimited identifiers and uses `FLOAT` over `REAL`
sql = """WITH baz AS (SELECT a, c FROM foo WHERE a = 1) SELECT f.a, b.b, baz.c, CAST("b"."a" AS REAL) d FROM foo f JOIN bar b ON f.a = b.a LEFT JOIN baz ON f.a = baz.a"""

# Translates the query into Spark SQL, formats it, and delimits all of its identifiers
print(sqlglot.transpile(sql, write="spark", identify=True, pretty=True)[0])
输出的结果为:
WITH `baz` AS (
  SELECT
    `a`,
    `c`
  FROM `foo`
  WHERE
    `a` = 1
)
SELECT
  `f`.`a`,
  `b`.`b`,
  `baz`.`c`,
  CAST(`b`.`a` AS FLOAT) AS `d`
FROM `foo` AS `f`
JOIN `bar` AS `b`
  ON `f`.`a` = `b`.`a`
LEFT JOIN `baz`
  ON `f`.`a` = `baz`.`a`




4、您可以使用表达式帮助程序探索 SQL,以执行诸如在查询中查找列和表之类的作:
from sqlglot import parse_one, exp

# print all column references (a and b)
for column in parse_one("SELECT a, b + 1 AS c FROM d").find_all(exp.Column):
    print(column.alias_or_name)

# find all projections in select statements (a and c)
for select in parse_one("SELECT a, b + 1 AS c FROM d").find_all(exp.Select):
    for projection in select.expressions:
        print(projection.alias_or_name)

# find all tables (x, y, z)
for table in parse_one("SELECT * FROM x JOIN y JOIN z").find_all(exp.Table):
    print(table.name)

其它的例子,可以参考官方文档即可。

附,目前支持的方言如下:

Dialect

Support Level

Athena

Official

BigQuery

Official

ClickHouse

Official

Databricks

Official

Doris

Community

Dremio

Community

Drill

Community

Druid

Community

DuckDB

Official

Exasol

Community

Fabric

Community

Hive

Official

Materialize

Community

MySQL

Official

Oracle

Official

Postgres

Official

Presto

Official

PRQL

Community

Redshift

Official

RisingWave

Community

SingleStore

Community

Snowflake

Official

Spark

Official

SQLite

Official

StarRocks

Official

Tableau

Official

Teradata

Community

Trino

Official

TSQL

Official

本文系外文翻译,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系外文翻译前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档