Ein Befehlszeilen-SQL-Formatierer, der in nahezu jeder Umgebung ausgeführt werden kann (sofern node.js installiert ist).
Es basiert auf dem NPM-Paket „Poor Man's T-SQL Formatter“ (poor-mans-t-sql-formatter), das wiederum auf der gleichnamigen C#-Bibliothek basiert ( https://github.com/TaoK/PoorMansTSqlFormatter ).
Dieser Formatierer sollte in seiner Funktionalität dem C#-Befehlszeilenformatierer entsprechen, der seit einigen Jahren existiert (herunterladbar unter http://architectshack.com/PoorMansTSqlFormatter.ashx), mit zwei wesentlichen Unterschieden:
Es ist super einfach zu installieren, insbesondere in Unix-Umgebungen – sofern Node.js verfügbar ist
Es ist um einiges langsamer als der .Net-basierte Formatierer.
(vorausgesetzt, node.js ist installiert)
npm install --global poor-mans-t-sql-formatter-cli
Piped/stdin-Eingabe und stdout-Ausgabe:
echo "select a from b join c on b.id = c.id where abc = 123 and def = N'whatêver' " | sqlformat
Dateieingabe und -ausgabe:
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
Dieser Befehlszeilenformatierer wird mit einem Exit-Code ungleich 0 beendet, wenn die SQL-Analyse „in Schwierigkeiten gerät“ – zum Beispiel, wenn er auf eine unvollständige „IF“-Anweisung stößt, was darauf hindeutet, dass etwas an der SQL nicht richtig verstanden/geparst wurde, und kann daher „falsch rauskommen“. Es gibt eine Option zum Deaktivieren dieses Verhaltens, wenn bekannt ist, dass die SQL zwielichtig ist oder die Verwirrung beim Parsen harmlos ist.
Wenn die Analyse abgebrochen wird, bleiben alle angegebenen „Ausgabedateien“ unberührt.
Spezifische Optionen für das Befehlszeilen-Dienstprogramm:
Option | Beschreibung | Typ | Standard |
---|---|---|---|
--inputFile | Lesen Sie die zu formatierende Eingabe aus einer Datei und nicht aus stdin (typisierte oder weitergeleitete Eingabe). | Zeichenfolge | |
--outputFile | Formatierte Ausgabe in eine Datei schreiben – ähnlich der Shell-Umleitung von stdout, außer im Fehlerfall bleibt die Datei unberührt | Zeichenfolge | |
--ignoreErrors | Gibt den Exit-Code 0 (Erfolg) zurück, auch wenn das Parsen fehlgeschlagen ist (und die formatierte Ausgabe daher verdächtig ist). | bool | |
--inputEncoding | Verwenden Sie für die Eingabe eine bestimmte vom Knoten unterstützte Zeichenkodierung – im Grunde utf-16le oder utf-8 | Zeichenfolge | utf-8 |
--outputEncoding | Verwenden Sie für die Ausgabe eine bestimmte vom Knoten unterstützte Zeichenkodierung – im Grunde utf-16le oder utf-8 | Zeichenfolge | utf-8 |
--forceOutputBOM | Fügen Sie am Anfang der Ausgabe eine Byte-Reihenfolge-Markierung (BOM) hinzu | bool |
Standardformatierungsoptionen:
(Bitte beachten Sie, dass boolesche Optionen, die in der Bibliothek normalerweise standardmäßig auf „true“ stehen, durch ein „no“-Präfix ersetzt wurden, entsprechend den Unixey-Befehlszeilenparameterkonventionen.)
Option | Beschreibung | Typ | Standard |
---|---|---|---|
--Einzug | Die Einheit des Einzugs – normalerweise ein Tabulator (t) oder eine Anzahl von Leerzeichen | Zeichenfolge | T |
--maxLineWidth | Fordern Sie den Formatierer auf, lange Zeilen umzubrechen, um eine Überschreitung dieser Zeilenlänge zu vermeiden | int | 999 |
--spacesPerTab | Dies wird zum Messen der Zeilenlänge verwendet und gilt nur, wenn Sie Tabulatoren verwenden | int | 4 |
--statementBreaks | Wie viele Zeilenumbrüche sollten beim Starten einer neuen Anweisung hinzugefügt werden? | int | 2 |
--clauseBreaks | Wie viele Zeilenumbrüche sollten hinzugefügt werden, wenn eine neue Klausel innerhalb einer Anweisung beginnt? | int | 1 |
--no-expandCommaLists | Sollten durch Kommas getrennte Listen (Spalten, Gruppierung nach Argumenten usw.) in neue Zeilen aufgeteilt werden? | bool | |
--no-trailingCommas | Wenn Sie aufgrund eines Kommas eine neue Zeile beginnen, sollte das Komma am Ende der Zeile stehen (VS am Anfang der nächsten)? | bool | |
--spaceAfterExpandedComma | Sollte nach dem Komma ein Leerzeichen eingefügt werden? (normalerweise nicht, wenn sie „nachlaufend“ sind) | bool | |
--no-expandBooleanExpressions | Sollten boolesche Operatoren (AND, OR) einen Zeilenumbruch verursachen? | bool | |
--no-expandCaseStatements | Sollten die WHEN- und THEN-Ausdrücke von CASE-Ausdrücken in neue Zeilen aufgeteilt werden? | bool | |
--no-expandBetweenConditions | Sollte bei BETWEEN-Ausdrücken das Argument max in einer neuen Zeile angezeigt werden? | bool | |
--expandInLists | Sollten IN()-Listen jedes Argument in einer neuen Zeile haben? | bool | |
--breakJoinOnSections | Sollte der ON-Abschnitt einer JOIN-Klausel in eine eigene Zeile aufgeteilt werden? | bool | |
--no-uppercaseKeywords | Sollten T-SQL-Schlüsselwörter (wie SELECT, FROM) automatisch in Großbuchstaben geschrieben werden? | bool | |
--keywordStandardization | Sollten weniger verbreitete T-SQL-Schlüsselwörter durch ihre Standard-Gegenstücke ersetzt werden? (HINWEIS: Nur sicher für T-SQL!) | bool |
Verschleiern von Formatierungsoptionen („min“-Befehl):
Option | Beschreibung | Typ | Standard |
---|---|---|---|
--randomizeKeywordCase | Sollte die Groß-/Kleinschreibung von Schlüsselwörtern randomisiert werden, um die Lesbarkeit zu minimieren? | bool | |
--randomizeLineLengths | Sollte die SQL in beliebigen Abständen umbrochen werden, um die Lesbarkeit zu minimieren? | bool | |
--no-preserveComments | Sollten Kommentare im Code beibehalten werden (anstatt entfernt zu werden)? | bool | |
--enableKeywordSubstitution | Sollten Schlüsselwörter mit Synonymen weniger gebräuchliche Formen verwenden? (HINWEIS: Nur sicher für T-SQL!) | bool |
Bitte beachten Sie, dass dieses Befehlszeilentool derzeit KEINE HTML-Ausgabe (mit Syntaxhervorhebung) erzeugt. Das Hinzufügen dieser Funktion wäre einigermaßen trivial, sie wird definitiv von der zugrunde liegenden Bibliothek unterstützt, aber ich habe keinen realistischen Anwendungsfall gesehen. Wenn Sie eine haben, lassen Sie es mich bitte wissen (und/oder forken Sie, fügen Sie die Option(en) hinzu, lassen Sie es mich wissen).
Dieser Formatierer „erbt“ praktisch alle Funktionen der T-SQL-Formatierungsbibliothek von Poor Man's:
Vollständige Unterstützung für MS SQL Server T-SQL, ohne (soweit ich weiß) Parsing-Fehler ** Einschließlich vollständiger prozeduraler/Batch-Code-Unterstützung, DDL, DML usw.
Angemessene Unterstützung für andere SQL-Dialekte (wird regelmäßig zum Formatieren von PL/SQL-, PostgreSql-, MySQL- usw.-Abfragen verwendet) ** Bestimmte Konstrukte funktionieren möglicherweise nicht oder werden für diese anderen Dialekte möglicherweise nicht korrekt/getreu beibehalten. Melden Sie bitte Probleme, wenn solche Bedenken festgestellt werden
Eine angemessene Anzahl von Formatierungskonfigurationsoptionen, weitere sind in Vorbereitung.
Wie im Dokument zum JS-Bibliothekspaket (https://github.com/TaoK/poor-mans-t-sql-formatter-npm-package) erwähnt, ist dieser Formatierer derzeit ziemlich langsam . Auf meinem Laptop dauert die Formatierung einer einzigen Abfrage etwa eine halbe Sekunde. Dies deutet darauf hin, dass es für Massenformatierungs-Workloads sinnvoll sein könnte, eine Wildcard-/rekursive Dateieingabe-/Ausgabeoption anzubieten.
Die Kodierungsunterstützung ist ebenfalls sehr begrenzt – da wir die integrierte Kodierungsunterstützung des Knotens verwenden, kommt es auf utf-8 oder utf-16le an. Es könnte sich lohnen, dieses Problem mit der iconv-lite-Bibliothek zu lösen, aber das Hinzufügen von noch mehr Code zum Laden hätte auch Nachteile. Etwas zum Nachdenken.
Abgesehen von diesen Dingen sind mir keine größeren offenen Bedenken bekannt (im Vergleich zum Beispiel zur C#-/.Net-Version desselben Befehlszeilenformatierers, der unter http://architectshack.com/PoorMansTSqlFormatter.ashx heruntergeladen werden kann), also keine Eingaben/Funktionen Anfragen sind willkommen!