Um formatador SQL de linha de comando que roda em praticamente qualquer ambiente (desde que o node.js esteja instalado).
É baseado no pacote NPM do Poor Man's T-SQL Formatter (poor-mans-t-sql-formatter), que por sua vez é baseado na biblioteca C# de mesmo nome ( https://github.com/TaoK/PoorMansTSqlFormatter ).
Este formatador deve ser equivalente em funcionalidade ao formatador de linha de comando C# que existe há alguns anos (pode ser baixado em http://architectshack.com/PoorMansTSqlFormatter.ashx), com duas diferenças principais:
É super fácil de instalar, especialmente em ambientes unixey - desde que o Node.js esteja disponível
É um pouco mais lento que o formatador baseado em .Net.
(assumindo que o node.js esteja instalado)
npm install --global poor-mans-t-sql-formatter-cli
Entrada canalizada/stdin e saída stdout:
echo "select a from b join c on b.id = c.id where abc = 123 and def = N'whatêver' " | sqlformat
entrada e saída de arquivo:
echo "with a as (select 1 as b) select * from a cros join c" > testfile.sql sqlformat -f testfile.sql -g testfile.sql cat testfile.sql
Este formatador de linha de comando sairá com um código de saída diferente de 0 se a análise SQL "tiver problemas" - por exemplo, se encontrar uma instrução "IF" inacabada, sugerindo que algo sobre o SQL não foi compreendido/analisado corretamente, e pode, portanto, "sair errado". Há uma opção para desabilitar esse comportamento se o SQL for suspeito ou se a confusão de análise for inócua.
Se a análise for abortada, qualquer "arquivo de saída" especificado permanecerá intacto.
Opções específicas do utilitário de linha de comando:
Opção | Descrição | Tipo | Padrão |
---|---|---|---|
--inputArquivo | Leia a entrada a ser formatada de um arquivo em vez de stdin (entrada digitada ou canalizada) | corda | |
--outputArquivo | Grava a saída formatada em um arquivo - como redirecionamento de shell de stdout, exceto em caso de erro, ele deixa o arquivo intacto | corda | |
--ignoreErrors | Retorna o código de saída 0 (sucesso), mesmo se a análise falhar (e, portanto, a saída formatada é suspeita) | bool | |
--inputEncoding | Use uma codificação de caracteres específica suportada pelo nó para entrada - basicamente utf-16le ou utf-8 | corda | utf-8 |
--outputEncoding | Use uma codificação de caracteres específica suportada pelo nó para saída - basicamente utf-16le ou utf-8 | corda | utf-8 |
--forceOutputBOM | Adicione uma marca de ordem de byte (BOM) ao início da saída | bool |
Opções de formatador padrão:
(observe que as opções booleanas que normalmente são padronizadas como "true" na biblioteca foram invertidas com um prefixo "no", seguindo as convenções de parâmetro de linha de comando unixey)
Opção | Descrição | Tipo | Padrão |
---|---|---|---|
--recuar | A unidade de recuo - normalmente uma tabulação (t) ou vários espaços | corda | t |
--maxLineWidth | Solicite que o formatador quebre linhas longas para evitar exceder esse comprimento de linha | interno | 999 |
--spacesPerTab | Isto é usado para medir o comprimento da linha e só se aplica se você usar tabulações | interno | 4 |
--statementBreaks | Quantas quebras de linha devem ser adicionadas ao iniciar uma nova instrução? | interno | 2 |
--clauseBreaks | Quantas quebras de linha devem ser adicionadas ao iniciar uma nova cláusula em uma instrução? | interno | 1 |
--no-expandCommaLists | As listas delimitadas por vírgulas (colunas, grupos por argumentos, etc.) devem ser divididas em novas linhas? | bool | |
--no-trailingCommas | Ao iniciar uma nova linha por causa de uma vírgula, a vírgula deve estar no final da linha (VS no início da próxima)? | bool | |
--spaceAfterExpandedComma | Deve ser adicionado um espaço após a vírgula? (normalmente não se estiverem "à direita") | bool | |
--no-expandBooleanExpressions | Os operadores booleanos (AND, OR) devem causar uma quebra de linha? | bool | |
--no-expandCaseStatements | As expressões CASE devem ter suas expressões WHEN e THEN divididas em novas linhas? | bool | |
--no-expandBetweenConditions | As expressões BETWEEN deveriam ter o argumento max dividido em uma nova linha? | bool | |
--expandInLists | As listas IN() deveriam ter cada argumento em uma nova linha? | bool | |
--breakJoinOnSections | A seção ON de uma cláusula JOIN deve ser dividida em sua própria linha? | bool | |
--no-maiúsculasPalavras-chave | As palavras-chave T-SQL (como SELECT, FROM) devem ser automaticamente maiúsculas? | bool | |
--keywordPadronização | As palavras-chave T-SQL menos comuns devem ser substituídas por suas contrapartes padrão? (NOTA: seguro apenas para T-SQL!) | bool |
Opções de ofuscação do formatador (comando "min"):
Opção | Descrição | Tipo | Padrão |
---|---|---|---|
--randomizeKeywordCase | O caso das palavras-chave deve ser randomizado, para minimizar a legibilidade? | bool | |
--randomizeLineLengths | O SQL deve ser agrupado em intervalos arbitrários, para minimizar a legibilidade? | bool | |
--no-preserveComentários | Os comentários no código devem ser retidos (em vez de eliminados)? | bool | |
--enableKeywordSubstituição | As palavras-chave com sinônimos devem usar formas menos comuns? (NOTA: seguro apenas para T-SQL!) | bool |
Observe que esta ferramenta de linha de comando NÃO produz atualmente saída HTML (destacada com sintaxe). Este seria um recurso razoavelmente trivial de adicionar, é definitivamente suportado pela biblioteca subjacente, mas não vi nenhum caso de uso realista. Se você tiver um, por favor me avise (e/ou bifurque, adicione a(s) opção(ões), me avise).
Este formatador efetivamente "herda" todas as funcionalidades da biblioteca T-SQL Formatter do Poor Man:
Suporte total para MS SQL Server T-SQL, sem (até onde eu sei) falhas de análise ** Incluindo suporte completo a código processual/em lote, DDL, DML, etc.
Suporte razoável para outros dialetos SQL (usados regularmente para formatar consultas PL/SQL, PostgreSql, MySQL, etc.) ** Construções específicas podem não funcionar ou podem não ser preservadas correta/fielmente para esses outros dialetos - registre problemas quando tais preocupações forem identificadas
Um número razoável de opções de configuração de formatação, com mais a caminho.
Conforme observado no documento do pacote da biblioteca JS (https://github.com/TaoK/poor-mans-t-sql-formatter-npm-package), este formatador está bastante lento no momento. No meu laptop, a formatação de apenas uma consulta leva cerca de meio segundo. Isso sugere que, para cargas de trabalho de formatação em massa, pode fazer sentido oferecer uma opção de entrada/saída de arquivo curinga/recursivo.
O suporte à codificação também é muito limitado - como usamos o suporte de codificação integrado do nó, ele se resume a utf-8 ou utf-16le. Pode valer a pena resolver isso com a biblioteca iconv-lite, mas adicionar ainda mais código para carregar também teria suas desvantagens. Algo em que pensar.
Além dessas coisas, não estou ciente de nenhuma preocupação importante pendente (em comparação, por exemplo, com a versão C #/.Net deste mesmo formatador de linha de comando, disponível para download em http://architectshack.com/PoorMansTSqlFormatter.ashx), portanto, qualquer entrada/recurso pedidos são bem-vindos!