Ich habe Python-Code geschrieben, um ein Tabellen- (Ansichts-) Abhängigkeitsdiagramm (PlantUML) aus SQL zu erstellen

Was ist das?

Ein Tabellen- (Ansichts-) Abhängigkeitsdiagramm wie dieses ...

UML.png

↓ Es ist eine Geschichte, dass ich Python-Code geschrieben habe, um ihn aus einer solchen SQL-Gruppe auszugeben. (PlantUML wurde verwendet, um die Figur zu erstellen)

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

Was ist Plant UML?

Laut wikipedia

PlantUML ist eine textbasierte Sprache zum Erstellen von Open Source-UML-Diagrammen

Korrekt. Es können verschiedene Modelldiagramme erstellt werden. Hier sind die Seiten, von denen ich gelernt habe.

--Lernen Sie die grundlegende Syntax und rendern Sie Diagramme - https://plantuml.com/ja/

So erstellen Sie ein Abhängigkeitsdiagramm

Gehen Sie in Python3 wie folgt vor:

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 /'Polsterung'/
left to right direction /'Wenn Sie ein Layout wünschen, das das Diagramm von links nach rechts erweitert'/
hide members /'Löschen Sie das Klassenattribut'/
hide circle /'Entfernen Sie die Klassenmarke'/
{}
@enduml
'''


def make_table_dependencies_for_platuml(sql:str):
    #Tabelle zu erstellen(Aussicht)Erhalten
    if len(prog_destination.findall(sql)) != 1:
        raise Exception('CREATE TABLE|Die INSERT INTO-Klausel existiert nicht.')
    else:
        destination_table = prog_destination.findall(sql)[0]

    #Referrer-Tabelle ohne Selbstreferenz abrufen
    origin_tables = [table for table in prog_origin.findall(sql) if table != destination_table]
    if len(origin_tables) == 0:
        raise Exception('Abhängigkeit besteht nicht')

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

#Wenn Sie PlantUML für jede SQL ausgeben möchten
# 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, []))))

Dann wird das folgende Ergebnis ausgegeben. Lassen Sie uns die Figur mit dem zuvor eingeführten Linkziel rendern. (Das am Anfang angezeigte Beziehungsdiagramm wird gezeichnet.)

@startuml
skinparam padding 10 /'Polsterung'/
left to right direction /'Wenn Sie ein Layout wünschen, das das Diagramm von links nach rechts erweitert'/
hide members /'Löschen Sie das Klassenattribut'/
hide circle /'Entfernen Sie die Klassenmarke'/
"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

Warum ich diesen Code geschrieben habe

Ich arbeite an der Datenanalyse, verarbeite jedoch häufig eine Tabelle mit BigQuery, um eine andere Tabelle zu erstellen, und verarbeite diese Tabelle dann, um eine Tabelle zu erstellen. Insbesondere bei der Ad-hoc-Analyse wird es schwierig, die Beziehungen zwischen Tabellen zu verstehen. Ich denke, dass es nützlich sein wird, um die Tabellenbeziehungen zu erfassen und ob Sie eine nutzlose Zwischentabelle erstellen.

↓ Aufgeblasene Tabellenabhängigkeiten uml_table.png

Referenz

――Die Idee, die Abhängigkeit zwischen Tabellen aus SQL und dem regulären Ausdruck zu erfassen, wurde aus dem folgenden Artikel erhalten. Wie erwartet ist es ZOZO: bete:

Andere

Schließlich

Wir fordern auch in diesem Jahr den Adventskalender heraus. Schauen Sie also bitte vorbei. https://qiita.com/advent-calendar/2019/sensy

Recommended Posts

Ich habe Python-Code geschrieben, um ein Tabellen- (Ansichts-) Abhängigkeitsdiagramm (PlantUML) aus SQL zu erstellen
Ich habe ein Tool erstellt, um automatisch ein einfaches ER-Diagramm aus der Anweisung CREATE TABLE zu generieren
Ich habe einen Code geschrieben, um die Quaternion mit Python in einen Ölerwinkel vom Typ z-y-x umzuwandeln
Bearbeiten Sie Excel in Python, um eine Pivot-Tabelle zu erstellen
Ich möchte mit Python ein Fenster erstellen
[Python] Erstellen Sie eine Tabelle von Pandas DataFrame zu Postgres
Ich habe ein Paket erstellt, um eine ausführbare Datei aus dem Hy-Quellcode zu erstellen
Python-Skript, das eine JSON-Datei aus einer CSV-Datei erstellt
Ich habe versucht, API list.csv mit Python aus swagger.yaml zu erstellen
Ich habe schnell ein Programm geschrieben, um DI mit Python zu lernen
Ich möchte viele Prozesse von Python aus starten
Ich habe ein Tool erstellt, um eine Wortwolke aus Wikipedia zu erstellen
Ich möchte eine Nachricht von Python an LINE Bot senden
[Python] Ich habe einen Test von "Streamlit" geschrieben, der das Erstellen von Visualisierungsanwendungen erleichtert.
[Python] So erstellen Sie eine Tabelle aus einer Liste (grundlegende Operation zum Erstellen von Tabellen / Ändern des Matrixnamens)
Ich habe ein Skript geschrieben, um mit AWS Lambda + Python 2.7 schnell eine Entwicklungsumgebung für Twitter Bot zu erstellen
Versuchen Sie, eine Python-Umgebung mit Visual Studio Code & WSL zu erstellen
Ich habe versucht, mit Python eine Liste von Primzahlen zu erstellen
[Python] So erhalten und ändern Sie Zeilen / Spalten / Werte aus einer Tabelle.
Ich habe den Code geschrieben, um den Brainf * ck-Code in Python zu schreiben
Ich habe eine Funktion zum Laden des Git-Erweiterungsskripts in Python geschrieben
Ich habe ein Skript geschrieben, um Webseiten-Links in Python zu extrahieren
Ich möchte eine Parameterliste aus CloudFormation-Code (yaml) erstellen.
5 Möglichkeiten zum Erstellen eines Python-Chatbots
Ich habe ein Plugin erstellt, um mit Vim eine Markdown-Tabelle aus CSV zu generieren
Ich war süchtig danach, eine Python-Venv-Umgebung mit VS Code zu erstellen
[Python] Ich habe einen einfachen Code geschrieben, der automatisch AA generiert (Ascii Art).
[Python-Memo] Ich möchte eine zweistellige Hexadezimalzahl aus einer Dezimalzahl erhalten
Erstellen Sie mit Mecab aus Python3 ein Tool, das Furigana automatisch mit HTML schüttelt
Vorgehensweise zum Erstellen einer virtuellen Python-Umgebung mit VS-Code unter Windows
Ich möchte eine in Python in PDF konvertierte Tabelle wieder in CSV konvertieren
[Outlook] Ich habe versucht, mit Python automatisch eine tägliche Berichtsmail zu erstellen
Ich habe ein Beispiel für den Zugriff auf Salesforce mit Python und Bottle erstellt
Ich habe versucht, einen Linebot zu erstellen (Implementierung)
So erstellen Sie einen Klon aus Github
Ich habe versucht, einen Linebot zu erstellen (Vorbereitung)
Ich möchte ein Glas aus Python verwenden
Ich möchte eine Python-Umgebung erstellen
So erstellen Sie ein Repository aus Medien
Ich möchte eine schöne Python-Entwicklungsumgebung für meinen neuen Mac erstellen
Ich habe versucht, eine Klasse zu erstellen, mit der Json in Python problemlos serialisiert werden kann
Ich habe eine Bibliothek zum Betreiben des AWS CloudFormation-Stacks über CUI (Python Fabric) erstellt.
Ich möchte eine Prioritätswarteschlange erstellen, die mit Python (2.7) aktualisiert werden kann.
Als ich versuchte, mit Python eine virtuelle Umgebung zu erstellen, funktionierte dies nicht
Ich habe versucht, automatisch eine Portverwaltungstabelle aus L2SW Config zu generieren
Ich habe versucht, mit Selenium + Python einfach ein vollautomatisches Anwesenheitssystem zu erstellen
[IBM Cloud] Ich habe versucht, über Cloud Funtions (Python) auf die Tabelle Db2 on Cloud zuzugreifen.
Erstellen Sie Einstellungen in Terraform, um Nachrichten von AWS Lambda Python3.8 an Slack zu senden
Ein Hinweis, dem ich beim Ausführen von Python mit Visual Studio Code verfallen war
Senden Sie eine Nachricht von Slack an einen Python-Server
[Python] Listenverständnis Verschiedene Möglichkeiten zum Erstellen einer Liste
Ich möchte einfach ein Rauschmodell erstellen
Ich wollte eine DLL erstellen, um eine in C von Python in ctypes geschriebene Funktion zu verwenden, aber es fiel mir schwer
So öffnen Sie einen Webbrowser über Python
Ich habe eine Funktion zum Abrufen von Daten aus der Datenbank spaltenweise mithilfe von SQL mit SQLite3 von Python [SQLite3, SQL, Pandas] erstellt.