Un diagramme de dépendance de table (vue) comme celui-ci ...
↓ 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);
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.
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
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
Nous contestons également le calendrier de l'Avent cette année, alors jetez un œil. https://qiita.com/advent-calendar/2019/sensy