본문으로 바로가기

DBeaver에 External Formatter 적용해보기

category ETC/DBeaver 2022. 6. 29. 15:48
728x90
반응형

목차

    개요

    DB IDE로써 DBeaver라는 Tool을 이용 중이다. 무료로 사용할 수 있으며 사용하고 싶은 기능은 모두 들어있어 아주 편리하게 이용 중이다. 그런데 DBeaver를 이용하다보니 SQL Formatter가 정리해 주는 SQL 구문이 문득 읽기 불편했다.

     

    DBeaver에서 기본으로 적용된 SQL Format 기능은 WHERE 절에 IN으로 특정 데이터만 검색할 경우 쭉 늘어선 형태로 정렬되어 데이터(uuid 데이터가 많아지는 경우)가 한눈에 들어오지 않는 점에서 그러했다.


    이를 해결하보고자 구글링 좀 해본 결과 DBeaver의 SQL Fomatter을 사용자가 지정할 수 있는 기능이 존재한다는 걸 알게되었다.  External Formatter 옵션을 이용하면 가능했으며 필자는 Python의 sqlparse라는 라이브러리를 적용했다


    External Formatter로 Sqlparse를 선택한 이유?

    이는 Django에서 SQL Logging을 하기 위해 사용중인 도구의 Formatting을 DBeaver의 External Formatter로 적용하기 위해서였다. Django에서 SQL Logging을 위해 django_sqlformatter라는 라이브러리를 사용 중이다. 필자의 기준에서 여타 다른 SQL Logging 보다 SQL 문을 읽기 쉽게 만들어주기에 Django를 세팅할 때 필수적으로 적용하곤 한다.  


    그런데 django_sqlformatter에서 사용중인 SQL Parsing을 python의 sqlparse 라이브러리가 해준다는 것을 알게 되었는데 이 라이브러리를
    그대로 DBeaver에도 적용해보고 싶었다


    External Formatter Setup

    적용 방법은 `DBeaver > 환경설정 > 편집기 > SQL 포맷` 메뉴에서 Formatter를 `External formatter`로 바꿔주자.

    이후 Command Line에 부분에 다음과 같이 적용해주자

    python {PYTHON_SCRIPT_FILE_PATH} ${file}
    
    - `python`: PC에 설치된 python을 가르킨다.
    - `PYTHON_SCRIPT_FILE_PATH`: python script file의 경로를 가르킨다.
    - `${file}`: 이 옵션은 text 그대로 적어주자 DBeaver의  *.sql을 가르킨다.

    예를 들어,  C 드라이브 밑에 Python file이 있다면 다음과 같을 것이다.

    python c:\\script.py ${file}

    설정이 된 예시는 다음과 같다.

    Window10에서 적용했기 때문에 역 슬래쉬가 2개씩 붙어있는 걸 확인할 수 있다. 본인이 사용한 운영체제에 맞는 경로 형식으로 삽입하길 바란다.

     

    PYTHON_SCRIPT_FILE_PATH

    앞서 PYTHON_SCRIPT_FILE_PATH에 python file의 경로를 적어줘야 한다고 언급했다. 단적으로 말하면 'notepad123.py'라는 파일의 위치를 말하는데 이 파일에는 다음과 같은 코드르 넣어줬다.

    # notepad123.py
    import sys
    import sqlparse
    
    def sql_formatter(record):
        sql = sqlparse.format(
            record,
            keyword_case='upper',
            identifier_case='lower',
            truncate_strings=70,
            reindent=True).strip('\n')
        sql = '\n'.join([l for l in sql.split('\n')])
        return sql
    
    
    # append
    file_path = sys.argv[1]
    with open(file_path, "r") as f:
        read_sql = f.read()
    
    with open(file_path, "w") as f:
        for sql in read_sql.split(';'):
            _sql = sql_formatter(sql)
            print(_sql)
            print("\n")

    그대로 복붙 해서 사용하거나 본인 취향에 맞게 수정해서 사용하자.

     

    비교해보자

    이제 변경된 옵션 전과 후를 비교해 보자

    Before

    DBeaver에서 제공하는 formatting 중에 서식 기본값을 적용해서 formating을 하게 되면 다음과 같다.

    SELECT
    	*
    FROM
    	TABLE1 t
    WHERE
    	a > 100
    	AND b BETWEEN 12 AND 45;
    
    SELECT
    	t.*
    	, j1.x
    	, j2.y
    FROM
    	TABLE1 t
    JOIN JT1 j1 ON
    	j1.a = t.a
    LEFT OUTER JOIN JT2 j2 ON
    	j2.a = t.a
    	AND j2.b = j1.b
    WHERE
    	t.xxx NOT NULL;
    
    DELETE
    FROM
    	TABLE1
    WHERE
    	a = 1;

    After

    SELECT *
    FROM table1 t
    WHERE a > 100
      AND b BETWEEN 12 AND 45
    
    SELECT t.*,
           j1.x,
           j2.y
    FROM table1 t
    JOIN jt1 j1 ON j1.a = t.a
    LEFT OUTER JOIN jt2 j2 ON j2.a=t.a
    AND j2.b=j1.b
    WHERE t.xxx NOT NULL
    
    DELETE
    FROM table1
    WHERE a=1

     


    마치며

    사실 주머니 사정만 괜찮다면 JetBrains 제품 군중에 DataGrip를 쓰고 싶은게 솔직한 심정이다. 취향대로라면 DataGrip의 SQL Formatting 방식이 최고로 보기 편하다. 그러하여 DataGrip의 SQL format을 적용해보고 싶었는데 구글링 해봐도 Data Grip 스타일처럼 제공해 주는 formatting Tool이나 lint를 찾지 못해 아쉬웠다.


    (본 포스팅이 도움이 되셨다면 공감 버튼 클릭 부탁드립니다)


    728x90
    반응형