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 다이어그램 작성을 위한 텍스트 기반 언어입니다.
그렇습니다.
다양한 모델 다이어그램을 만들 수 있습니다.
배우기 위해 서있는 사이트를 나란히 둡니다.
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);
wikipedia에 따르면
PlantUML은 오픈 소스 UML 다이어그램 작성을 위한 텍스트 기반 언어입니다.
그렇습니다.
다양한 모델 다이어그램을 만들 수 있습니다.
배우기 위해 서있는 사이트를 나란히 둡니다.
종속성 다이어그램을 만드는 방법
다음을 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로 테이블을 가공해 또 다른 테이블을 만들어, 한층 더 그 테이블을 가공해 테이블을 만드는 것이 자주 있습니다. 특히 애드혹 분석을 하면 테이블 간의 관계를 파악하기가 어려워집니다. 테이블 관계의 파악이나 쓸데없는 중간 테이블을 만들지 않았는지 등에 도움이 될까 생각합니다.
↓ 부풀어 오른 테이블의 의존 관계
참고
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로 테이블을 가공해 또 다른 테이블을 만들어, 한층 더 그 테이블을 가공해 테이블을 만드는 것이 자주 있습니다. 특히 애드혹 분석을 하면 테이블 간의 관계를 파악하기가 어려워집니다. 테이블 관계의 파악이나 쓸데없는 중간 테이블을 만들지 않았는지 등에 도움이 될까 생각합니다.
↓ 부풀어 오른 테이블의 의존 관계
참고
기타
마지막으로
폐사, 올해도 어드벤트 캘린더에 도전중이므로 부디 봐 주세요.
htps : // 코 m / 아 d
Reference
이 문제에 관하여(SQL에서 table (view) 종속성 다이어그램 (PlantUML)을 만드는 파이썬 코드를 작성했습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/nassy20/items/ef4d241600ed348c2620
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(SQL에서 table (view) 종속성 다이어그램 (PlantUML)을 만드는 파이썬 코드를 작성했습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/nassy20/items/ef4d241600ed348c2620텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)