MySQL - nur neue Datensätze in eine CSV Datei exportieren
Mit diesem Beispiel möchten wir Ihnen zeigen wie aus einer MySQL Tabelle mit Hilfe von FlowHeater Parametern eine dynamische CSV Export Definition angelegt werden kann die bei jeder Ausführung automatisch nur die seit der letzten Ausführung neu hinzugefügten Datensätze exportiert.
Beim ersten/initialen Aufruf werden dabei automatisch alle verfügbaren Datensätze der MySQL Tabelle in die CSV Textdatei exportiert.
Vorbereitung
Damit das funktioniert benötigt die MySQL Tabelle entweder ein Auto Inkrement (AutoID) Feld, ein Datumsfeld (DATETIME) in dem das Erzeugungsdatum des Datensatzes z.B. über einen Standardwert (CURRENT_TIMESTAMP(6)) abspeichert wird oder aber irgendein anderes eindeutiges fortlaufendes sortierbares Kriterium.
Hinweis: Ab MySQL Version 5.6 können DATETIME Felder mit Micro Sekunden (6 stellig) abgespeichert werden, somit ist auch bei hoch frequentierten MySQL Datenbanken eine sehr genaue Abgrenzung der Datensätze möglich. Eine Abgrenzung nur auf Sekundenbasis wäre hier auf jeden Fall zu ungenau!
Fangen wir an
Zuerst legen wir eine neue FlowHeater Definition an und wählen auf der READ Seite den MySQL Adapter sowie auf der WRITE Seite den Textfile Adapter zum Schreiben der CSV Textdatei aus.
Öffnen Sie den MySQL Adapter Konfigurator der READ Seite und tragen Sie hier die Verbindungsparameter für Ihren MySQL Datenbankserver ein und führen einen kurzen Verbindungstest durch. Konnte die Verbindung zur MySQL Datenbank erfolgreich hergestellt werden wechseln Sie anschließend auf den Reiter "Felder / Datentypen" und wählen die MySQL Tabelle mittels der Combobox aus. Es werden hier nur verfügbare Tabellen der vorher ausgewählten MySQL Datenbank aufgelistet. Wenn Sie die richtige Tabelle gefunden haben müssen noch die Schemainformationen der MySQL Tabelle eingelesen werden, dies erledigen Sie über den Button "Felder Einlesen".
Machen wir weiter mit der Konfiguration des Textfile Adapter für den CSV Export. Hier tragen wir auf dem ersten Reiter lediglich den Export Dateinamen "export.csv" ein und wählen die Option "Erste Zeile enthält Feldnamen" aus. Anschließend wechseln wir auf den Reiter „Felder / Datentypen" und übernehmen mittels des Buttons „Felder von READ Adapter kopieren" alle Felder der eben ausgewählten MySQL Tabelle. Hinweis: Die so übernommen CSV Feld bzw. Spaltennamen können beliebig verändert werden.
Nun müssen noch die Felder der READ Seite (MySQL) mit den Feldern der WRITE (CSV) Textdatei verbunden werden.
Kommen wir zur Dynamik
Mit den so durchführten Einstellungen würde pro Export die komplette MySQL Tabelle in die definierte CSV Textdatei geschrieben werden. Ziel soll es aber sein, nur seit dem letzten Export neu hinzugekommene Datensätze zu exportieren.
Schritt 1) Zuerst benötigen wir einen FlowHeater Parameter, der den zuletzt verwendeten AutoID (Auto Inkrement) Wert der Spalte ID speichert. Gehen Sie hierzu über "Menü->Bearbeiten->Parameter" und fügen einen neuen Parameter "LASTID" hinzu und aktivieren für diesen Parameter die Option "Speichern". Hiermit teilen Sie dem FlowHeater mit, dass der letzte Wert des Parameters für die nächste Ausführung gespeichert werden soll. Um beim ersten Export alle verfügbaren Datensätze der MySQL Tabelle in unsere CSV Textdatei zu exportieren initialisieren wir den Standardwert des Parameters mit dem Wert „0". Damit der Parameter LASTID für die weiter unten angesprochene WHERE Klausel richtig funktioniert müssen wir noch angeben, dass der Wert als INTEGER (Ganzzahl) Wert zu behandeln ist und ganz wichtig hier, die Standard Zahlenformatierung muss so angepasst werden, dass keine Tausendertrennzeichen verwendet werden!
Schritt2) Anschließend müssen wir noch den SELECT auf der READ (MySQL) Seite so anpassen, dass der Parameter "$LASTID$" in der WHERE Klausel aufgenommen wird. Dann muss natürlich gewährleistet werden, dass der FlowHeater die MySQL Tabelle aufsteigend liest, damit der höchste ID Wert auch als letztes verarbeitet wird, da dieser ja bei der nächsten Ausführung als neuer Startwert dienen soll. Hierzu reicht es aus einen ORDER BY id hinter die WHERE Klausel anzufügen. Der SELECT zum Abrufen der MySQL Tabelle sollten nun wie folgt aussehen.
SELECT * FROM t_export WHERE id > $LASTID$ ORDER BY id
Schritt 3) Zum Schluss muss der FlowHeater Parameter "LASTID" noch mit dem gerade aktuellen Wert der MySQL Tabelle gesetzt werden. Hierzu ziehen wir einen Parameter Heater auf den Designer. Über einen Doppelklick auf den Heater öffnet sich der Konfigurationsdialog. Hier wählen wir einmal die Funktion „Set" aus um den Parameter zu setzen. Aus der Combobox wählen wir noch den oben angelegten Parameter "LASTID" aus. Über OK verlassen wir den Dialog und verbinden zu guter Letzt das MySQL Feld „ID" mit dem Set Paramater Heater.
Wie funktioniert das?
Wird die Definition zum ersten Mal ausgeführt, wird der Parameter $LASTID$ mit dem Standardwert initialisiert und alle vorhandenen Datensätze der Tabelle werden in die CSV Datei exportiert. Nach erfolgreichen Export wird der letzte ID Wert für die nächste Verarbeitung gespeichert. Wird nun die Datenexport Definition ein weiteres Mal ausgeführt, wir der Parameter mit diesem zuletzt verarbeiteten Wert initialisiert und durch die WHERE Klausel auf der MySQL READ Seite ist sichergestellt, dass nur neue Datensätze verarbeitet werden.
Hinweis: Im Testmodus werden die Parameter nicht gespeichert!
Zusammenfassung
Um dynamisch nur neue Datensätze aus einer MySQL Tabelle in eine CSV Textdatei zu exportieren sind lediglich drei kleine Schritte zu beachten. Parameter Anlegen, in die SQL WHERE Bedingung packen und den Parameter für die weitere Verarbeitung setzen.