[PYTHON] Automatische Konvertierung von der MySQL Workbench-MWB-Datei in eine SQL-Datei

Für wen ist das Dokument?

Eine Person, die MySQL Workbench verwendet, um eine DB-Tabelle zu definieren (ER-Diagrammerstellung)

Jemand, der MWB-Dateien unter Versionskontrolle hält, aber die Unterschiede nicht erkennen kann (weil es binär ist)

Jemand, der hart daran arbeitet, die interne XML zu analysieren, um mwb als Text zu behandeln

Probleme beim Verwalten von Tabellendefinitionen mit mwb

Angenommen, Sie erstellen eine "Benutzer" -Tabelle wie unten gezeigt, speichern sie in der Datei "app.mwb" und führen "git add", "git commit" aus. Image 1.png

Nun, dann ging die Entwicklung weiter und wir beschlossen, eine "Artikel" -Tabelle hinzuzufügen. Image 2.png Angenommen, Sie überschreiben app.mwb mit git commit -u.

Was sehen Sie nun, wenn Sie sich nach einer Weile dieses Festschreibungsprotokoll ansehen? Möglicherweise sehen Sie den Unterschied, wenn Sie die Dateien bei beiden Revisionen abrufen und den Inhalt in Workbench überprüfen. In der Regel ist der Unterschied zwischen den Textdateien jedoch nur leicht zu erkennen. (Es wäre schön, wenn es ein MWB-Diff wie das Bilddiff auf Github gäbe, aber im Moment scheint es so etwas nicht zu geben.)

Wenn mwb binär ist, sollte es Text sein

Es ist möglich, die mwb-Datei selbst (eigentlich eine XML-Datei mit Zip-Packung) zu analysieren, um die internen Tabellendefinitionen abzurufen, aber MySQL Workbench verfügt tatsächlich über eine Lua-Python-Skriptschnittstelle. Dieses Mal werden wir dies verwenden, um mwb → sql zu konvertieren. Danach scheint es gut, zum Zeitpunkt von "git commit" zu haken und die SQL-Datei automatisch unter Versionskontrolle zu stellen. Bitte legen Sie fest, wie Sie mit dem Versionsverwaltungssystem umgehen sollen.

wichtiger Punkt

In der ersten Ausgabe möchte ich das X WIndow-System nicht nur für die Verwendung von MySQL Workbench einbinden, daher verwende ich den virtuellen Xvfb-Frame-Puffer. (Bei Windows wird der Bildschirm für einen Moment angezeigt, aber wir geben auf.) In Bezug auf die zweite habe ich es geschafft, während ich mir den Code von MySQL Workbench selbst angesehen habe, daher kann ich nicht garantieren, dass er wirklich korrekt ist. In Bezug auf die dritte Anweisung können Sie beispielsweise steuern, ob eine DROP TABLE-Anweisung über die GUI hinzugefügt werden soll oder nicht. Derzeit wissen wir jedoch nicht, wie sie über ein Skript ausgeführt werden soll. Diesmal besteht der Zweck jedoch darin, den Unterschied in Text umzuwandeln und leicht zu überprüfen, sodass es nicht viel ausmacht.

Code

Das folgende Repository enthält den erforderlichen Code, Beispiele und die Verwendung. Das Python-Skript ist ebenfalls in den Hauptteil mwb2sql.sh eingebettet, passt aber tatsächlich in ungefähr 10 Zeilen.

https://github.com/tomoemon/mwb2sql

Erläuterung

Umgebung

Installation

Anlaufen

Aktivieren Sie die virtuelle Anzeige in Xvfb. Wenn Sie Xvfb starten, erhalten Sie möglicherweise eine Nachricht über die Schriftart, aber das ist mir egal.

$ Xvfb :1 &
[dix] Could not init font path element /usr/share/fonts/X11/cyrillic, removing from list!

Starten Sie in diesem Zustand MySQL Workbench mit einem virtuellen Frame-Puffer von 1: 1. Das Python-Skript zum Speichern des Modells ist in "mwb2sql.sh" geschrieben. Wenn Sie es also wie folgt starten, enthält "a.sql" alle in "test.mwb" definierten Schemata. Die Anweisung CREATE für die Tabelle wird gedruckt.

$ DISPLAY=:1 sh mwb2sql.sh test.mwb a.sql

Da es einen virtuellen Frame-Puffer verwendet, sollte es auch dann gut funktionieren, wenn es über ssh verbunden ist.

Der folgende Inhalt wird an "a.sql" ausgegeben.

python


-- ----------------------------------------------------------------------------
-- MySQL Workbench Migration
-- Migrated Schemata: mydb
-- Source Schemata: 
-- Created: Thu Aug 01 02:32:15 2013
-- ----------------------------------------------------------------------------

SET FOREIGN_KEY_CHECKS = 0;;

-- ----------------------------------------------------------------------------
-- Schema mydb
-- ----------------------------------------------------------------------------
DROP SCHEMA IF EXISTS `mydb` ;
CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ;

-- ----------------------------------------------------------------------------
-- Table mydb.table1
-- ----------------------------------------------------------------------------
CREATE  TABLE IF NOT EXISTS `mydb`.`table1` (
  `id` INT NOT NULL ,
  `name` VARCHAR(45) NULL ,
  `created` DATETIME NULL ,
  `updated` DATETIME NULL ,
  PRIMARY KEY (`id`) )
ENGINE = InnoDB;
SET FOREIGN_KEY_CHECKS = 1;;

Kooperation mit Git Hook

Zum Schluss kombinieren wir dieses Skript mit Git Hook, um automatisch eine SQL-Textdatei festzuschreiben. Fügen Sie die Datei "git_pre-commit" als ".git / hooks / pre-commit" des Repositorys, das Sie derzeit für die Entwicklung verwenden, in das Repository ein.

Exportieren Sie die DISPLAY-Spezifikation, da es keine Spezifikation für die Verwendung des virtuellen Frame-Puffers im Hook-Skript gibt. Sie können das Hook-Skript neu schreiben.

$ export DISPLAY=:1

Versuchen Sie in diesem Zustand "git add", "git commit" eine beliebige MWB-Datei im zu entwickelnden Repository. Eine Datei wie test.mwb .__ auto_generated __. Sql sollte erstellt und automatisch festgeschrieben werden. In diesem Fall handelt es sich um einen clientseitigen Hook, den Sie jedoch als serverseitigen Hook verwenden können.

Bonus: Für diejenigen, die Workbench nur zum Zeichnen von ER-Diagrammen verwenden

Es ist viel stabiler als zuvor, aber es ist immer noch wahrscheinlicher, dass es mit ein wenig Bedienung fällt **, daher empfehle ich es nicht als Werkzeug nur zum Zeichnen von Diagrammen. Es gibt jedoch viele Funktionen, die nur für Workbench gelten, z. B. die Synchronisierung der tatsächlichen Tabelle auf dem DB-Server mit dem Modell auf mwb und die Berücksichtigung des Unterschieds. Wenn Sie also Workbench verwenden, wird empfohlen, diese Funktionen ebenfalls zu verwenden. Machen.

Recommended Posts

Automatische Konvertierung von der MySQL Workbench-MWB-Datei in eine SQL-Datei
Konvertierung von pdf nach txt 1 [pdfminer]
Stellen Sie von Flask aus eine Verbindung zum MySQL-Container von Docker her
Einfache Konvertierung von UTC in Ortszeit
Herstellen einer Verbindung von Python zu MySQL unter CentOS 6.4
Excel-Datei aus Python importieren (in DB registriert)
Von der Datei zur Diagrammzeichnung in Python. Grundstufe Grundstufe
Ein Skript, das eine FlatBuffers-Binärdatei aus einer SQL-Datenbank erstellt
Es kann keine Verbindung zu MySQL über die Docker-Umgebung (Debian) hergestellt werden.
[AWS] Migrieren Sie Daten von DynamoDB nach Aurora MySQL