J'ai écrit du code Python pour créer un diagramme de dépendance de table (vue) (PlantUML) à partir de SQL

Qu'est-ce que c'est?

Un diagramme de dépendance de table (vue) comme celui-ci ...

UML.png

↓ C'est une histoire que j'ai écrit du code Python pour sortir d'un groupe de SQL comme celui-ci. (PlantUML a été utilisé pour créer la figure)

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);

Qu'est-ce que Plant UML?

Selon wikipedia

PlantUML est un langage textuel pour la création de diagrammes UML open source

C'est vrai. Différents schémas de modèle peuvent être créés. Voici les sites sur lesquels j'ai appris.

Comment créer un diagramme de dépendances

Procédez comme suit dans 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 /'Réglage du rembourrage'/
left to right direction /'Si vous voulez une mise en page qui étend le diagramme de gauche à droite'/
hide members /'Effacer l'attribut de classe'/
hide circle /'Supprimer la marque de classe'/
{}
@enduml
'''


def make_table_dependencies_for_platuml(sql:str):
    #Table à créer(Vue)Avoir
    if len(prog_destination.findall(sql)) != 1:
        raise Exception('CREATE TABLE|La clause INSERT INTO n'existe pas.')
    else:
        destination_table = prog_destination.findall(sql)[0]

    #Obtenir la table des référents excluant l'auto-référence
    origin_tables = [table for table in prog_origin.findall(sql) if table != destination_table]
    if len(origin_tables) == 0:
        raise Exception('La dépendance n'existe pas')

    return [F'"{table}" <|-- "{destination_table}"' for table in origin_tables]

#Si vous voulez sortir PlantUML pour chaque sql
# 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, []))))

Ensuite, le résultat suivant sera affiché. Rendons la figure avec la destination du lien introduite plus tôt. (Le diagramme de relations qui apparaît au début est dessiné.)

@startuml
skinparam padding 10 /'Réglage du rembourrage'/
left to right direction /'Si vous voulez une mise en page qui étend le diagramme de gauche à droite'/
hide members /'Effacer l'attribut de classe'/
hide circle /'Supprimer la marque de classe'/
"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

Pourquoi j'ai écrit ce code

Je travaille sur l'analyse des données, mais je traite souvent une table avec BigQuery pour créer une autre table, puis je traite cette table pour créer une table. Surtout avec une analyse ad hoc, il devient difficile de comprendre les relations entre les tables. Je pense que cela sera utile pour comprendre les relations de table et si vous faites une table intermédiaire inutile.

↓ Dépendances de table gonflées uml_table.png

référence

Autre

finalement

Nous contestons également le calendrier de l'Avent cette année, alors jetez un œil. https://qiita.com/advent-calendar/2019/sensy

Recommended Posts

J'ai écrit du code Python pour créer un diagramme de dépendance de table (vue) (PlantUML) à partir de SQL
J'ai créé un outil pour générer automatiquement un simple diagramme ER à partir de l'instruction CREATE TABLE
J'ai écrit un code pour convertir quaternion en angle de graissage de type z-y-x avec Python
Modifier Excel à partir de Python pour créer un tableau croisé dynamique
Je veux créer une fenêtre avec Python
[python] Créer une table de pandas DataFrame vers postgres
J'ai créé un package pour créer un fichier exécutable à partir du code source Hy
Script Python qui crée un fichier JSON à partir d'un fichier CSV
J'ai essayé de créer une API list.csv avec Python à partir de swagger.yaml
J'ai écrit rapidement un programme pour étudier la DI avec Python ①
Je veux démarrer beaucoup de processus à partir de python
J'ai créé un outil pour créer un nuage de mots à partir de wikipedia
Je souhaite envoyer un message de Python à LINE Bot
[Python] J'ai écrit un test de "Streamlit" qui facilite la création d'applications de visualisation.
[Python] Comment créer une table à partir d'une liste (opération de base de création de table / changement de nom de matrice)
J'ai écrit un script pour créer rapidement un environnement de développement pour Twitter Bot avec AWS Lambda + Python 2.7
Essayez de créer un environnement python avec Visual Studio Code et WSL
J'ai essayé de créer une liste de nombres premiers avec python
[Python] Comment obtenir et modifier les lignes / colonnes / valeurs d'une table.
J'ai écrit le code pour écrire le code Brainf * ck en python
J'ai écrit une fonction pour charger le script d'extension Git en Python
J'ai écrit un script pour extraire les liens de pages Web en Python
Je souhaite créer une liste de paramètres à partir du code CloudFormation (yaml)
5 façons de créer un chatbot Python
J'ai créé un plugin pour générer une table Markdown à partir de csv avec Vim
J'étais accro à la création d'un environnement Python venv avec VS Code
[Python] J'ai écrit un code simple qui génère automatiquement AA (Ascii Art)
[Mémo Python] Je souhaite obtenir un nombre hexadécimal à 2 chiffres à partir d'un nombre décimal
Créez un outil qui secoue automatiquement furigana avec html en utilisant Mecab de Python3
Procédure de création d'un environnement virtuel Python avec VS Code sous Windows
Je souhaite convertir une table convertie en PDF en Python en CSV
[Outlook] J'ai essayé de créer automatiquement un e-mail de rapport quotidien avec Python
J'ai créé un exemple pour accéder à Salesforce en utilisant Python et Bottle
J'ai essayé de créer un linebot (implémentation)
Comment créer un clone depuis Github
J'ai essayé de créer un linebot (préparation)
Je veux utiliser jar de python
Je veux créer un environnement Python
Comment créer un référentiel à partir d'un média
Je veux créer un bel environnement de développement Python pour mon nouveau Mac
J'ai essayé de créer une classe qui peut facilement sérialiser Json en Python
J'ai créé une bibliothèque pour faire fonctionner la pile AWS CloudFormation à partir de CUI (Python Fabric)
Je souhaite créer une file d'attente prioritaire pouvant être mise à jour avec Python (2.7)
Quand j'ai essayé de créer un environnement virtuel avec Python, cela n'a pas fonctionné
J'ai essayé de générer automatiquement une table de gestion des ports à partir de L2SW Config
J'ai essayé de créer facilement un système de présence entièrement automatique avec Selenium + Python
[IBM Cloud] J'ai essayé d'accéder à la table Db2 on Cloud à partir de Cloud Funtions (python)
Créez des paramètres dans terraform pour envoyer des messages depuis AWS Lambda Python3.8 vers Slack
Une note à laquelle j'étais accro lors de l'exécution de Python avec Visual Studio Code
Envoyer un message de Slack à un serveur Python
[Python] Compréhension de liste Différentes façons de créer une liste
Je souhaite créer facilement un modèle de bruit
Je voulais créer une dll pour utiliser une fonction écrite en C à partir de Python dans ctypes, mais j'ai eu du mal
Comment ouvrir un navigateur Web à partir de python
J'ai créé une fonction pour récupérer les données de la colonne de base de données par colonne en utilisant sql avec sqlite3 de python [sqlite3, sql, pandas]