项目地址 https://github.com/tobymao/sqlglot
SQLGlot 是一个无依赖的 SQL 解析器、转译器、优化器和引擎。它可用于格式化 SQL 或在 30 种不同的方言之间进行翻译,例如 DuckDB、Presto / Trino、Spark / Databricks、Snowflake 和 BigQuery。它旨在读取各种 SQL 输入,并在目标方言中以语法和语义正确输出 SQL。
它是一个非常全面的通用 SQL 解析器,具有强大的测试套件。它的性能也相当高,同时纯粹是用 Python 编写的。
您可以轻松自定义解析器、分析查询、遍历表达式树以及以编程方式构建 SQL。
SQLGlot 可以检测各种语法错误,例如不平衡的括号、保留关键字的错误使用等。这些错误会突出显示,并且方言不兼容可能会根据配置发出警告或引发。
安装
pip3 install "sqlglot[rs]"
# Without Rust tokenizer (slower):
# pip3 install sqlglot
例子
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 删除。