SQL에서 table (view) 종속성 다이어그램 (PlantUML)을 만드는 파이썬 코드를 작성했습니다.

이게 뭐야?



이런 식의 table(view)의 의존관계도를....



↓이런 느낌의 SQL군으로부터, 출력하기 위한 Python 코드를 썼다고 하는 이야기입니다.
(그림 작성에는 PlantUML을 사용했습니다)
CREATE TABLE
  `project.dataset.table5` AS
SELECT
  *
FROM
  `project.dataset.table1`;
CREATE TABLE IF NOT EXISTS
  `project.dataset.table6` AS
SELECT
  *
FROM
  `project.dataset.table2`
UNION ALL
SELECT
  *
FROM
  `project.dataset.table3`;
CREATE VIEW
  `project.dataset.table7` AS
SELECT
  *
FROM
  `project.dataset.table3`
INNER JOIN
  `project.dataset.table4`
USING
  (user_id);

PlantUML이란?



wikipedia에 따르면

PlantUML은 오픈 소스 UML 다이어그램 작성을 위한 텍스트 기반 언어입니다.

그렇습니다.
다양한 모델 다이어그램을 만들 수 있습니다.
배우기 위해 서있는 사이트를 나란히 둡니다.
  • 기본적인 구문을 배우거나 그림을 렌더링 할 수 있다.
  • htps : // p ぁつ ml. 코 m/그럼/

  • 매우 사용하기 쉬운 개인 개발 앱
  • h tp // 스조유. 기주 b. 이오


  • 종속성 다이어그램을 만드는 방법



    다음을 Python3에서 실행하십시오.
    sql1 = '''CREATE TABLE
      `project.dataset.table5` AS
    SELECT
      *
    FROM
      `project.dataset.table1`;
    '''
    
    sql2 = '''CREATE TABLE IF NOT EXISTS
      `project.dataset.table6` AS
    SELECT
      *
    FROM
      `project.dataset.table2`
    UNION ALL
    SELECT
      *
    FROM
      `project.dataset.table3`;
    '''
    
    sql3 = '''CREATE VIEW
      `project.dataset.table7` AS
    SELECT
      *
    FROM
      `project.dataset.table3`
    INNER JOIN
      `project.dataset.table4`
    USING
      (user_id);
    '''
    
    import re
    prog_destination = re.compile(r'(?:CREATE TABLE|CREATE TABLE IF NOT EXISTS|CREATE VIEW|CREATE VIEW IF NOT EXISTS|INSERT INTO|INSERT)[\s \n]+`(.+?)`')
    prog_origin = re.compile(r'(?:FROM|JOIN)[\s \n]+`(.+?)`')
    
    platuml_tempate = '''@startuml
    skinparam padding 10 /'paddingの調整'/
    left to right direction /'diagramを左から右に伸ばして行くレイアウトにしたい場合'/
    hide members /'classの属性を消す'/
    hide circle /'classマークを消す'/
    {}
    @enduml
    '''
    
    
    def make_table_dependencies_for_platuml(sql:str):
        # 作成するテーブル(ビュー)を取得
        if len(prog_destination.findall(sql)) != 1:
            raise Exception('CREATE TABLE|INSERT INTO句が存在しません。')
        else:
            destination_table = prog_destination.findall(sql)[0]
    
        # 自己参照を除いた参照元テーブルを取得
        origin_tables = [table for table in prog_origin.findall(sql) if table != destination_table]
        if len(origin_tables) == 0:
            raise Exception('依存関係が存在しません')
    
        return [F'"{table}" <|-- "{destination_table}"' for table in origin_tables]
    
    # sql毎にPlantUMLを出力したい場合
    # print(platuml_tempate.format('\n'.join(make_table_dependencies_for_platuml(sql1))))
    # print(platuml_tempate.format('\n'.join(make_table_dependencies_for_platuml(sql2))))
    # print(platuml_tempate.format('\n'.join(make_table_dependencies_for_platuml(sql3))))
    
    all_sql_dependencies = [make_table_dependencies_for_platuml(sql) for sql in [sql1, sql2, sql3]]
    print(platuml_tempate.format('\n'.join(sum(all_sql_dependencies, []))))
    

    그러면 다음과 같은 결과가 출력될 것이라고 생각합니다.
    방금 소개한 링크처 등으로 그림을 렌더링해 봅시다.
    (처음에 나온 관계도가 그려집니다.)
    @startuml
    skinparam padding 10 /'paddingの調整'/
    left to right direction /'diagramを左から右に伸ばして行くレイアウトにしたい場合'/
    hide members /'classの属性を消す'/
    hide circle /'classマークを消す'/
    "project.dataset.table1" <|-- "project.dataset.table5"
    "project.dataset.table2" <|-- "project.dataset.table6"
    "project.dataset.table3" <|-- "project.dataset.table6"
    "project.dataset.table3" <|-- "project.dataset.table7"
    "project.dataset.table4" <|-- "project.dataset.table7"
    @enduml
    

    왜 이 코드를 작성했는가



    데이터 분석의 일을 하고 있습니다만, BigQuery로 테이블을 가공해 또 다른 테이블을 만들어, 한층 더 그 테이블을 가공해 테이블을 만드는 것이 자주 있습니다. 특히 애드혹 분석을 하면 테이블 간의 관계를 파악하기가 어려워집니다. 테이블 관계의 파악이나 쓸데없는 중간 테이블을 만들지 않았는지 등에 도움이 될까 생각합니다.

    ↓ 부풀어 오른 테이블의 의존 관계


    참고


  • SQL에서 테이블 간의 종속성을 파악한다는 발상과 정규 표현은 아래 기사에서 얻었습니다. 과연 ZOZO입니다
  • GitHub로 관리되는 데이터 마트 구축 기반 소개 - ZOZO Technologies TECH BLOG


  • 기타


  • GraphViz & PyDot 를 사용하는 손도 있다.
  • htps : // 코 b. 레세아 rch. 오, ぇ. 이 m/노테보오 ks/s 닛페 ts/이 m포 r g_ぃb 라리 s. 이 pyn b # sc 로트 l = w9 lcG2wSRDx


  • 마지막으로



    폐사, 올해도 어드벤트 캘린더에 도전중이므로 부디 봐 주세요.
    htps : // 코 m / 아 d

    좋은 웹페이지 즐겨찾기