Traffine I/O

Bahasa Indonesia

2023-03-12

SQLFluff

Apa itu SQLFluff

SQLFluff adalah Perangkat Lunak Sumber Terbuka (OSS) yang secara otomatis mengidentifikasi dan memperbaiki masalah dalam format SQL Anda. SQLFluff mendukung berbagai dialek SQL (grammar), sehingga menjadi alat yang efektif dan fleksibel untuk lingkungan SQL yang beragam.

Anda dapat mengakses SQLFluff dan pembaruan terbarunya dari repositori resmi Github:

https://github.com/sqlfluff/sqlfluff

Berbeda dengan bahasa lainnya, SQL tidak memiliki banyak pedoman penulisan yang spesifik. Namun, tren penggunaan SQL oleh profesional non-IT, seperti salesperson dan marketer, untuk menganalisis data semakin meningkat. Seiring dengan banyaknya orang yang menggunakan SQL untuk analisis data, gaya penulisan SQL yang dihasilkan akan bervariasi secara luas. Menggunakan SQLFluff untuk memaksa secara semi menyatukan gaya penulisan query dapat dianggap sebagai upaya yang baik untuk menjaga standar dan meningkatkan efisiensi analisis data.

Instalasi

Untuk menginstal SQLFluff, Anda perlu memiliki Python3 terpasang di sistem Anda.

Anda dapat menginstal SQLFluff menggunakan pip, yang merupakan manajer paket untuk Python. Cukup masukkan perintah berikut:

bash
$ pip3 install sqlfluff

Menggunakan SQLFluff

SQLFluff menyediakan dua fungsi utama: lint dan fix.

Lint

lint dirancang untuk membaca query SQL dan menyoroti masalah yang ditemukan.

Pertimbangkan query SQL berikut:

example.sql
       SELECT
  ABC, XYZ
  froM
TMP

Untuk menggunakan lint, masukkan query SQL sebagai berikut:

bash
$ sqlfluff lint example.sql --dialect=bigquery

== [example.sql] FAIL
L:   1 | P:   1 | LT01 | Expected only single space before 'SELECT' keyword.
                       | Found '       '. [layout.spacing]
L:   1 | P:   1 | LT02 | First line should not be indented.
                       | [layout.indent]
L:   1 | P:   1 | LT13 | Files must not begin with newlines or whitespace.
                       | [layout.start_of_file]
L:   1 | P:   8 | LT09 | Select targets should be on a new line unless there is
                       | only one select target.
                       | [layout.select_targets]
L:   2 | P:   1 | LT02 | Expected indent of 4 spaces.
                       | [layout.indent]
L:   3 | P:   3 | CP01 | Keywords must be consistently upper case.
                       | [capitalisation.keywords]
L:   4 | P:   1 | LT02 | Expected indent of 4 spaces.
                       | [layout.indent]
All Finished πŸ“œ πŸŽ‰!

Untuk menggunakan lint, masukkan query SQL sebagai berikut:

lint akan menghasilkan beberapa baris teks, setiap baris mengidentifikasi masalah spesifik dalam query SQL.

Dalam output ini, L menunjukkan nomor baris, dan P menunjukkan posisi masalah dalam baris tersebut. Di sebelahnya, Anda akan melihat kode kesalahan seperti LT01, LT02, dll., diikuti oleh pesan yang menggambarkan masalah yang diidentifikasi.

Untuk pemahaman yang lebih detail tentang kode kesalahan yang dikembalikan oleh SQLFluff, lihat dokumentasi resmi:

https://docs.sqlfluff.com/en/stable/rules.html

dialek

Anda dapat memilih dari berbagai dialek saat menggunakan SQLFluff. Gunakan perintah berikut untuk menampilkan daftar dialek yang tersedia:

bash
$ sqlfluff dialects

==== sqlfluff - dialects ====
ansi:                 ansi dialect [inherits from 'nothing']
athena:                athena dialect [inherits from 'ansi']
bigquery:            bigquery dialect [inherits from 'ansi']
clickhouse:        clickhouse dialect [inherits from 'ansi']
databricks:    databricks dialect [inherits from 'sparksql']
db2:                      db2 dialect [inherits from 'ansi']
duckdb:            duckdb dialect [inherits from 'postgres']
exasol:                exasol dialect [inherits from 'ansi']
greenplum:      greenplum dialect [inherits from 'postgres']
hive:                    hive dialect [inherits from 'ansi']
materialize:   materialize dialect [inherits from 'postgres']
mysql:                  mysql dialect [inherits from 'ansi']
oracle:                oracle dialect [inherits from 'ansi']
postgres:            postgres dialect [inherits from 'ansi']
redshift:        redshift dialect [inherits from 'postgres']
snowflake:          snowflake dialect [inherits from 'ansi']
soql:                    soql dialect [inherits from 'ansi']
sparksql:            sparksql dialect [inherits from 'ansi']
sqlite:                sqlite dialect [inherits from 'ansi']
teradata:            teradata dialect [inherits from 'ansi']
tsql:                    tsql dialect [inherits from 'ansi']

Menyesuaikan Aturan SQLFluff

SQLFluff memungkinkan penyesuaian detail aturannya. Anda dapat mengonfigurasi semua aturan, aturan individu, dan bahkan cakupan penerapan aturan.

Pengaturan aturan dapat diubah dengan menulis konfigurasi kustom Anda dalam salah satu file berikut:

  • setup.cfg
  • tox.ini
  • pep8.ini
  • .sqlfluff
  • pyproject.toml

Misalnya, Anda dapat mengonfigurasi file .sqlfluff sebagai berikut:

.sqlfluff
[sqlfluff]
dialect = bigquery
exclude_rules = L036

Dalam kasus ini, semua aturan kecuali aturan L036 akan diterapkan.

fix

Sementara lint hanya menunjukkan masalah dalam query SQL Anda sesuai dengan aturan yang ditetapkan, fix melakukan langkah lebih lanjut. Selain mengidentifikasi masalah, fix juga mencoba memperbaikinya secara otomatis.

Untuk menggunakan fix, gunakan perintah berikut:

Ketika Anda menjalankan perintah tersebut, SQLFluff akan pertama-tama mencari pelanggaran aturan. Jika ditemukan pelanggaran, SQLFluff akan meminta konfirmasi sebelum mencoba memperbaikinya. Untuk melanjutkan dengan perbaikan, jawab dengan Y.

bash
$ sqlfluff fix example1.sql --dialect=bigquery

==== finding fixable violations ====
== [example.sql] FAIL
L:   1 | P:   1 | LT01 | Expected only single space before 'SELECT' keyword.
                       | Found '       '. [layout.spacing]
L:   1 | P:   1 | LT02 | First line should not be indented.
                       | [layout.indent]
L:   1 | P:   8 | LT09 | Select targets should be on a new line unless there is
                       | only one select target.
                       | [layout.select_targets]
L:   2 | P:   1 | LT02 | Expected indent of 4 spaces.
                       | [layout.indent]
L:   3 | P:   3 | CP01 | Keywords must be consistently upper case.
                       | [capitalisation.keywords]
L:   4 | P:   1 | LT02 | Expected indent of 4 spaces.
                       | [layout.indent]
==== fixing violations ====
6 fixable linting violations found

Are you sure you wish to attempt to fix these? [Y/n]

When you execute the command, SQLFluff will first find any violations of the rules. If it finds any, it will ask for confirmation before attempting to fix them. To proceed with the fixes, respond with Y.

Attempting fixes...
Persisting Changes...
== [example.sql] FIXED
Done. Please check your files to confirm.
All Finished πŸ“œ πŸŽ‰!

Setelah Anda mengonfirmasi perbaikan, SQLFluff akan secara otomatis membuat perubahan yang diperlukan pada query SQL Anda.

example.sql
SELECT
    ABC,
    XYZ
FROM
    TMP

Seperti lint, Anda juga dapat menyesuaikan aturan untuk fix sesuai dengan kebutuhan Anda.

Referensi

https://github.com/sqlfluff/sqlfluff
https://docs.sqlfluff.com/en/stable/rules.html

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!