背景
SQL进行版本化控制后,我们希望为SQL加入lint步骤。这样做的好处是我们可以在真正执行SQL前发现问题。
本文中,我们通过Bazel执行SQLFluff[1]以实现SQL的lint。
SQLFluff是一款使用Python语言使用的,支持SQL多方言的SQL lint工具。
它的特点是:
1. 支持多方言。如:Snowflake、PostgreSQL、ClickHouse。所有支持的方言列表:https://docs.sqlfluff.com/en/stable/dialects.html;
2. 可以输出正确的SQL,减少了我们手工修正SQL的工作;
3. 同时支持命令行方式使用和API调用方式。
集成到CI/CD流水线中
在我看来,在CICD流水线中实现SQL lint有两种方式:
• 方式一:在流水线中增加一个SQL lint步骤;
• 方式二:将SQL lint的逻辑写在测试代码,执行测试步骤,就自动执行了SQL lint。
方式二是我最爱,我会在本文最后讲原因。
工程结构
.
├── BUILD.bazel
├── WORKSPACE
├── repository-hibernate-impl
│ ├── BUILD.bazel
│ └── src
│ ├── main
│ │ └── sql
│ │ └── V1__runbook_table.sql
│ └── test
│ └── python
│ ├── BUILD.bazel
│ ├── requirements_lock.txt
│ └── sql_test.py