node.js가 설치되어 있는 경우 거의 모든 환경에서 실행되는 명령줄 SQL 포맷터입니다.
이는 Poor Man's T-SQL Formatter NPM 패키지(poor-mans-t-sql-formatter)를 기반으로 하며, 이는 동일한 이름의 C# 라이브러리(https://github.com/TaoK/PoorMansTSqlFormatter)를 기반으로 합니다. ).
이 포맷터는 몇 년 동안 존재했던 C# 명령줄 포맷터(http://architectshack.com/PoorMansTSqlFormatter.ashx에서 다운로드 가능)와 기능적으로 동일해야 하지만 두 가지 주요 차이점이 있습니다.
특히 Unixey 환경에서는 Node.js를 사용할 수 있는 한 설치가 매우 쉽습니다.
.Net 기반 포맷터보다 속도가 상당히 느립니다.
(node.js가 설치되어 있다고 가정)
npm install --global poor-mans-t-sql-formatter-cli
파이프/표준 입력 입력 및 표준 출력:
echo "select a from b join c on b.id = c.id where abc = 123 and def = N'whatêver' " | sqlformat
파일 입력 및 출력:
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
이 명령줄 포맷터는 SQL 구문 분석이 "문제가 발생"하는 경우 0이 아닌 종료 코드로 종료됩니다. 예를 들어 SQL에 대한 내용이 올바르게 이해/구문 분석되지 않았음을 암시하는 완료되지 않은 "IF" 문을 발견한 경우 그러므로 "잘못 나올" 수도 있습니다. SQL이 의심스럽거나 구문 분석 혼란이 무해한 것으로 알려진 경우 이 동작을 비활성화하는 옵션이 있습니다.
구문 분석이 중단되면 지정된 "출력 파일"은 그대로 유지됩니다.
명령줄 유틸리티별 옵션:
옵션 | 설명 | 유형 | 기본 |
---|---|---|---|
--input파일 | stdin이 아닌 파일에서 형식화할 입력 읽기(입력 또는 파이프 입력) | 끈 | |
--output파일 | 파일에 형식화된 출력 쓰기 - stdout의 쉘 리디렉션과 유사하지만 오류 발생 시 파일을 그대로 유지한다는 점만 제외 | 끈 | |
--ignoreErrors | 구문 분석에 실패하더라도 0(성공) 종료 코드를 반환합니다. 따라서 형식화된 출력이 의심됩니다. | 부울 | |
--inputEncoding | 입력을 위해 노드에서 지원하는 특정 문자 인코딩(기본적으로 utf-16le 또는 utf-8)을 사용하십시오. | 끈 | UTF-8 |
--outputEncoding | 출력을 위해 노드에서 지원하는 특정 문자 인코딩을 사용하십시오(기본적으로 utf-16le 또는 utf-8). | 끈 | UTF-8 |
--forceOutputBOM | 출력 시작 부분에 BOM(바이트 순서 표시)을 추가합니다. | 부울 |
표준 포맷터 옵션:
(라이브러리에서 일반적으로 기본값이 "true"인 부울 옵션은 unixey 명령줄 매개변수 규칙에 따라 "no" 접두사로 바뀌었습니다.)
옵션 | 설명 | 유형 | 기본 |
---|---|---|---|
--톱니 모양 | 들여쓰기 단위 - 일반적으로 탭(t) 또는 공백 수 | 끈 | 티 |
--maxLineWidth | 이 줄 길이를 초과하지 않도록 포맷터가 긴 줄을 줄바꿈하도록 요청합니다. | 정수 | 999 |
--spacesPerTab | 이는 선 길이를 측정하는 데 사용되며 탭을 사용하는 경우에만 적용됩니다. | 정수 | 4 |
--statementBreaks | 새 문을 시작할 때 몇 개의 줄 바꿈을 추가해야 합니까? | 정수 | 2 |
--clauseBreaks | 명령문 내에서 새 절을 시작할 때 줄 바꿈을 몇 개나 추가해야 합니까? | 정수 | 1 |
--no-expandCommaLists | 쉼표로 구분된 목록(열, 인수별 그룹 등)을 새 줄로 나누어야 합니까? | 부울 | |
--no-trailing쉼표 | 쉼표 때문에 새 줄을 시작할 때 쉼표는 줄 끝에 있어야 합니까(VS 다음 줄의 시작)? | 부울 | |
--spaceAfterExpanded쉼표 | 쉼표 뒤에 공백을 추가해야 합니까? (일반적으로 "후행"인 경우에는 그렇지 않음) | 부울 | |
--no-expandBooleanExpressions | 부울 연산자(AND, OR)로 인해 줄바꿈이 발생해야 합니까? | 부울 | |
--no-expandCaseStatements | CASE 표현식에는 WHEN 및 THEN 표현식이 새 줄로 구분되어야 합니까? | 부울 | |
--no-expandBetweenConditions | BETWEEN 표현식의 최대 인수가 새 줄에 표시되어야 합니까? | 부울 | |
--expandInLists | IN() 목록에는 새 줄에 각 인수가 있어야 합니까? | 부울 | |
--breakJoinOnSections | JOIN 절의 ON 섹션을 자체 줄로 분리해야 합니까? | 부울 | |
--대문자 없음키워드 | T-SQL 키워드(예: SELECT, FROM)는 자동으로 대문자로 표시되어야 합니까? | 부울 | |
--keyword표준화 | 덜 일반적인 T-SQL 키워드를 표준 대응 키워드로 바꿔야 할까요? (참고: T-SQL에만 안전합니다!) | 부울 |
난독화 포맷터("min" 명령) 옵션:
옵션 | 설명 | 유형 | 기본 |
---|---|---|---|
--randomizeKeywordCase | 가독성을 최소화하기 위해 키워드의 경우를 무작위로 지정해야 합니까? | 부울 | |
--randomizeLineLengths | 가독성을 최소화하기 위해 SQL을 임의의 간격으로 래핑해야 합니까? | 부울 | |
--no-preserve설명 | 코드의 주석을 유지해야 합니까(제거됩니까?)? | 부울 | |
--enableKeywordSubstitution | 동의어가 포함된 키워드는 덜 일반적인 형식을 사용해야 합니까? (참고: T-SQL에만 안전합니다!) | 부울 |
이 명령줄 도구는 현재 HTML(구문 강조) 출력을 생성하지 않습니다. 이것은 추가하기에는 상당히 사소한 기능이며 기본 라이브러리에서 확실히 지원되지만 현실적인 사용 사례는 본 적이 없습니다. 가지고 있는 경우 알려주시기 바랍니다(및/또는 포크하거나 옵션을 추가하거나 알려주세요).
이 포맷터는 Poor Man's T-SQL 포맷터 라이브러리의 모든 기능을 효과적으로 "상속"합니다.
내가 아는 한 구문 분석 오류 없이 MS SQL Server T-SQL을 완벽하게 지원합니다. ** 전체 절차/배치 코드 지원, DDL, DML 등을 포함합니다.
다른 SQL 방언에 대한 합리적인 지원(PL/SQL, PostgreSql, MySQL 등 쿼리 형식을 지정하는 데 일반적으로 사용됨) ** 특정 구성은 다른 방언에 대해 작동하지 않거나 정확/충실하게 보존되지 않을 수 있습니다. 이러한 문제가 식별되면 문제를 제출하십시오.
합리적인 수의 서식 구성 옵션이 제공되며 앞으로 더 많은 옵션이 추가될 예정입니다.
JS 라이브러리 패키지 문서(https://github.com/TaoK/poor-mans-t-sql-formatter-npm-package)에 언급된 대로 현재 이 포맷터는 다소 느립니다 . 내 노트북에서는 단일 쿼리의 형식을 지정하는 데 약 0.5초가 걸립니다. 이는 대량 형식 지정 작업 부하의 경우 와일드카드/재귀 파일 입력/출력 옵션을 제공하는 것이 합리적일 수 있음을 의미합니다.
인코딩 지원도 매우 제한적입니다. 노드의 내장 인코딩 지원을 사용하므로 utf-8 또는 utf-16le로 귀결됩니다. iconv-lite 라이브러리를 사용하여 이 문제를 해결할 가치가 있을 수 있지만 로드할 코드를 더 추가하면 단점도 있습니다. 생각해 볼 것.
이러한 것 외에도 나는 어떤 중요한 문제도 인식하지 못합니다(예를 들어 http://architectshack.com/PoorMansTSqlFormatter.ashx에서 다운로드할 수 있는 동일한 명령줄 포맷터의 C#/.Net 버전과 비교). 따라서 모든 입력/기능 요청을 환영합니다!