[PYTHON] J'ai créé un outil pour générer automatiquement un simple diagramme ER à partir de l'instruction CREATE TABLE

L'autre jour, j'ai créé un outil de ligne de commande appelé Pyagram qui génère automatiquement un diagramme de transition d'état, mais en tant que fonction supplémentaire de cela, la relation entre les tables de l'instruction CREATE TABLE Implémentation d'une fonction pour générer automatiquement un diagramme ER simple qui ne peut être compris.

Personnellement, je n'utilise pas du tout de clés externes, donc il y avait un problème que je ne pouvais pas générer un diagramme ER avec des relations entre les tables lors de l'utilisation de MySQL Workbench. Par conséquent, j'ai décidé de créer un outil qui peut deviner le parent et l'enfant à partir du nom de la colonne et les associer même s'il n'y a pas de clé externe.

Il existe certaines restrictions d'utilisation, veuillez donc comprendre ce qui suit avant de l'utiliser.

En outre, la vérification peut encore être inadéquate, de sorte qu'elle peut ne pas fonctionner. Nous vous serions reconnaissants de bien vouloir le signaler dans la section commentaires ou dans le Problème Github.

Ce qui suit est la figure générée.

erd.gif

Préparez un fichier dans lequel l'instruction CREATE TABLE suivante est définie comme fichier d'entrée.

CREATE TABLE employees (
    id INT(11) NOT NULL AUTO_INCREMENT,
    birth_date DATE NOT NULL,
    first_name VARCHAR(100) NOT NULL,
    last_name VARCHAR(100) NOT NULL,
    gender INT(11) NOT NULL,
    hire_date DATE NOT NULL,
    department_id int(11),
    PRIMARY KEY('id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

CREATE TABLE departments (
    id INT(11) NOT NULL AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    PRIMARY KEY('id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

CREATE TABLE titles (
    id INT(11) NOT NULL AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    PRIMARY KEY('id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

CREATE TABLE employee_title (
    employee_id INT(11) NOT NULL,
    title_id INT(11) NOT NULL,
    from_date DATE NOT NULL,
    to_date DATE NOT NULL,
    PRIMARY KEY('employee_id', 'title_id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

CREATE TABLE salaries (
    id INT(11) NOT NULL AUTO_INCREMENT,
    employee_id INT(11) NOT NULL,
    salary INT(11) NOT NULL,
    from_date DATE NOT NULL,
    to_date DATE NOT NULL,
    PRIMARY KEY('id'),
    KEY('employee_id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

Exécutez la commande suivante pour générer le diagramme.

pyagram -t {Type d'image} -o {Chemin de sortie} -i {Fichier d'entrée} -f {Nom de la police} -d erd

Vous pouvez également l'installer avec la commande suivante.

pip3 install pyagram

Pour ce correctif, nous avons fait un gros changement pour en faire une implémentation enfichable. En héritant de la classe appelée Diagram, vous pouvez créer autant de classes de génération de diagramme que vous le souhaitez. Dans la classe Diagram

  1. analyse_ lexicale
  2. analyse_syntaxique
  3. generate_dot (génération de données pour le fichier dot)
  4. generate_image (génération de fichier image)

Il existe à peu près quatre processus, mais dans la classe qui hérite de Diagram, il est fait de sorte que 1 à 3 puissent être implémentés.

À l'avenir, je voudrais augmenter le nombre d'éléments de sortie et les types de SGBDR qui le prennent en charge, mais ce sera un peu pénible, alors j'aimerais prendre le temps de continuer.

Recommended Posts

J'ai créé un outil pour générer automatiquement un simple diagramme ER à partir de l'instruction CREATE TABLE
J'ai créé un outil pour générer du Markdown à partir du fichier JSON Scrapbox exporté
J'ai créé un outil pour créer un nuage de mots à partir de wikipedia
J'ai créé un plugin pour générer une table Markdown à partir de csv avec Vim
J'ai essayé de générer automatiquement une table de gestion des ports à partir de L2SW Config
J'ai créé un outil pour sauvegarder automatiquement les métadonnées de l'organisation Salesforce
J'ai fait une commande pour marquer le clip de la table
J'ai écrit du code Python pour créer un diagramme de dépendance de table (vue) (PlantUML) à partir de SQL
J'ai fait une commande pour générer un commentaire pour une table dans Django
J'ai créé un outil pour générer automatiquement un diagramme de transition d'état pouvant être utilisé à la fois pour le développement Web et le développement d'applications
J'ai créé un outil pour parcourir automatiquement plusieurs sites avec Selenium (Python)
Créez un outil qui secoue automatiquement furigana avec html en utilisant Mecab de Python3
J'ai fait une simple minuterie qui peut être démarrée depuis le terminal
J'ai créé un outil pour compiler nativement Hy
J'ai créé un outil pour obtenir de nouveaux articles
J'ai fait un outil pour estimer le temps d'exécution de cron (+ débuts de PyPI)
J'ai créé un package pour créer un fichier exécutable à partir du code source Hy
Essayez de créer une table d'enregistrement de bataille avec matplotlib à partir des données de "Schedule-kun"
[Python] J'ai créé un système pour introduire "la recette que je veux vraiment" depuis le site de recettes!
J'ai essayé d'introduire l'outil de génération de diagramme blockdiag
J'ai créé un outil qui facilite un peu la création et l'installation d'une clé publique.
J'ai essayé de créer automatiquement un rapport avec la chaîne de Markov
J'ai créé un outil pour obtenir les liens de réponse d'OpenAI Gym en même temps
Je veux générer automatiquement un nom de groupe de metal moderne
J'ai fait une fonction pour vérifier le modèle de DCGAN
Une histoire qui a permis de créer automatiquement une liste de lecture Anison à partir de vos fichiers musicaux
Créer un diagramme de corrélation à partir de l'historique des conversations de Twitter
[Titan Craft] J'ai créé un outil pour invoquer un géant sur Minecraft
Je vous ai fait exécuter des commandes depuis un navigateur WEB
Je veux créer un Dockerfile pour le moment.
J'ai essayé de faire un programme pour résoudre (indice) la recherche d'erreur de Saiseriya
Je veux trouver automatiquement des pièces de haute qualité à partir des vidéos que j'ai tournées
J'ai essayé de créer un pointage de crédit simple avec régression logistique.
Je veux créer un système pour éviter d'oublier de serrer la clé 1
Continuation: j'ai essayé d'introduire l'outil de génération de diagramme blockdiag
J'ai essayé de couper une image fixe de la vidéo
J'ai essayé de créer un outil d'échafaudage pour le framework Web Python Bottle
J'ai fait une commande pour afficher un calendrier coloré dans le terminal
J'ai fait un programme qui calcule automatiquement le zodiaque avec tkinter
J'ai créé un script POST pour créer un problème sur Github et l'enregistrer dans le projet
Je souhaite envoyer un signal uniquement du sous-thread au thread principal
[Django] a créé un champ pour saisir des dates avec des nombres à 4 chiffres
J'ai fait une minuterie de cuisine à afficher sur la barre d'état!
J'ai créé un outil CLI pour convertir les images de chaque répertoire en PDF
J'ai fait une sorte d'outil de traitement d'image simple en langage Go.
[Outlook] J'ai essayé de créer automatiquement un e-mail de rapport quotidien avec Python
J'ai créé un konoha de bibliothèque qui fait passer le tokenizer à une belle sensation
J'ai créé un outil pour convertir Jupyter py en ipynb avec VS Code
J'ai fait un programme pour vérifier la taille d'un fichier avec Python
J'ai créé une fonction pour voir le mouvement d'un tableau à deux dimensions (Python)
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)
J'ai fait un script pour afficher des pictogrammes
Comment créer un référentiel à partir d'un média
J'ai créé un outil d'estampage automatique du navigateur.