Quan
escrivim una consulta en SQL tan important és que funcioni
correctament com que sigui llegible i mantenible en un
futur. Per això cal establir uns estàndards a l’hora d’escriure
les consultes per facilitar-ne la lectura.
Però, com validar que s’estan complint aquests estàndards?
Amb Linters de programari lliure com SQLFluff podem automatitzar aquesta validació,
assegurant-nos que el codi que posem a producció compleix les normes
de format.
Com utilitzar SQLFluff?
SQLFluff (https://www.sqlfluff.com/) s’instal·la com una llibreria python (https://pypi.org/project/sqlfluff/) i, mitjançant la definició d’unes regles al fitxer .sqlfluff, fa la validació dels fitxers que vulguem.
La comanda a executar per a validar un fitxer sql és:
sqlfluff lint <nom_del_fitxer>.sql
Aquesta comanda també permet posar wildcards per a analitzar més d’un fitxer a la vegada, incloses també subcarpetes.
SQLFluff busca el fitxer .sqlfluff a la carpeta on estem executant el lint com a les carpetes pare. Si una regla està definida més d’una vegada, prioritza aquella que està en una subcarpeta més propera a la carpeta d’execució.
Quines regles podem utilitzar a SQLFluff?
Les regles que podem fer servir les podem trobar en la següent documentació: https://docs.sqlfluff.com/en/stable/reference/rules.html
Algunes de les regles principals són:
- max_line_length: llargària màxima de les línies de codi (ex. 120)
- tab_space_size: mida dels espais que equivalen a un tabulador (ex. 4).
- line_position: a on van les comes entre camps quan se separen per línies (ex. leading, si la coma va al davant).
SQLFluff també permet definir en quin dialecte està escrita la consulta i interpreta també codi jinja, cosa que ens és molt útil si tenim fitxers de DBT.
Amb SQLFluff també podem decidir ignorar algunes regles, o bé, rebaixar-les a nivell de warning.
exclude_rules = ST06,AM05,ST07
warnings = RF02
Fins i tot permet ignorar regles dins d’un fitxer concret, afegint --noqa: <regles> a les línies on no volem que s’apliqui. (https://docs.sqlfluff.com/en/stable/configuration/ignoring_configuration.html).
SQLFluff permet molta flexibilitat a l’hora de definir què volem validar, adaptant-se a cada tipologia de projecte i estàndards definits.
A continuació hi ha una possible configuració de .sqlfluff en postgres, amb línies de com a màxim 120 caràcters, amb les comes inicials on s’ignoren algunes regles i alguna es posa en warning.
[sqlfluff] dialect = postgres ignore = templating # evitar problemes amb dbt max_line_length = 120 # ST06 ordre de les columnes: Select wildcards then simple targets before calculations and aggregates. # AM05 ambiguous.join obliga a posar INNER JOIN en comptes de JOIN i LEFT/RIGHT OUTER JOIN en comptes de LEFT/RIGHT JOIN # ST07 structure.using no permet fer joins amb USING exclude_rules = ST06,AM05,ST07 # RF02 Unqualified reference 'nom_columna' found in select with more than one referenced table/view. warnings = RF02 [sqlfluff:indentation] tab_space_size = 4 # RF04 Keywords should not be used as identifiers. Ens passa amb les columnes year, month. # Aquí podem posar els noms de columnes que sí que volem permetre [sqlfluff:rules:references.keywords] ignore_words = year,month [sqlfluff:layout:type:comma] line_position = leading [sqlfluff:rules:aliasing.table] aliasing = implicit
SQLFluff també es pot integrar en un sistema de CI/CD per tal d’assegurar que el codi pujat a producció compleix els estàndards definits per l’organització.
Aquest artícle ha estat possible gràcies a la trobada d’equips de dades de cooperatives l’ESS que vam fer al novembre (https://coopdevs.coop/blog/el-blog-de-coopdevs-1/trobada-dequips-de-dades-de-cooperatives-de-leconomia-social-i-solidaria-55).