目前从事大数据相关的开发,都离不开SQL,不管是关系型数据库还是非关系型数据,在做不同数据库间迁移或者转换的时候都会用到SQL转换。今天来为大家分享一个有趣的开源项目,SQLGlot,一个纯Python开发的SQL转换器,目前GitHub上已经5.3k星了,感兴趣可以关注看看。
项目介绍
SQLGlot 是一个全面的 SQL 解析器、转译器、优化器和引擎,纯由Python开发。
该项目可以用于格式化 SQL 或在 DuckDB、Presto/Trino、Spark/Databricks、Snowflake 和 BigQuery 等 21 种不同的方言之间进行转换。其目标是读取多种 SQL 输入,并在目标方言中输出正确语法和语义上的 SQL。这是一个非常全面的通用 SQL 解析器,具有强大的测试套件。它还相当高效,并且纯粹使用 Python 编写。可以轻松定制解析器、分析查询、遍历表达式树,并以程序方式构建 SQL。语法错误会被突出显示,方言不兼容性则会根据配置发出警告或引发。然而,SQLGlot 并不旨在成为 SQL 验证器,因此可能无法检测到某些语法错误。
GitHub地址:GitHub - tobymao/sqlglot: Python SQL Parser and Transpiler
官方文档:sqlglot API documentation
使用安装
使用pip安装:
pip3 install "sqlglot[rs]"
# Without Rust tokenizer (slower):
# pip3 install sqlglot
使用案例
格式转换
SQLGlot可以轻松从一种方言翻译成另一种方言。例如,日期/时间函数因方言而异,并且可能难以处理:
import sqlglot
sqlglot.transpile("SELECT EPOCH_MS(1618088028295)", read="duckdb", write="hive")[0]
'SELECT FROM_UNIXTIME(1618088028295 / POW(10, 3))'
SQLGlot 甚至可以转换自定义时间格式:
import sqlglot
sqlglot.transpile("SELECT STRFTIME(x, '%y-%-m-%S')", read="duckdb", write="hive")[0]
"SELECT DATE_FORMAT(x, 'yy-M-ss')"
标识符分隔符和数据类型也可以翻译:
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"""
# Transl