Ein Tabellen- (Ansichts-) Abhängigkeitsdiagramm wie dieses ...
↓ 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);
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/
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
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
――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:
Wir fordern auch in diesem Jahr den Adventskalender heraus. Schauen Sie also bitte vorbei. https://qiita.com/advent-calendar/2019/sensy