MySQL CSV Export mit n:m Beziehung und WordPress CSV Import

Als ich von meinem alten Blogsystem (Eigenentwicklung) auf WordPress umstellen wollte, ergab sich das Problem, wie ich meine alten Postings möglichst verlustfrei in WordPress importieren kann.

Das Problem stellte dabei eine N:M Beziehung in meinem Altsystem dar: Ein Posting hat mehrere Tags und jedes Tag kann natürlich von mehreren Postings verwendet werden.

Die Grundidee war dabei die Tabelle als XML zu exportieren und die N:M Beziehung dort einfach denormalisiert als XML-Elemente unterhalb des Postings abzulegen. Leider habe ich in MySQL nun nichts gefunden, mit dem man Daten in XML umformen kann.

Stattdessen habe nun die Tags eines Postings mit Kommas in einer Spalte verbunden, was man dann als CSV exportieren kann.

Dies kann man bewerkstelligen, in dem man den folgenden Code an seine Bedürfnisse anpasst:

SELECT
  notes.*,
  GROUP_CONCAT(tags.name) as taglist
FROM
  notes
LEFT JOIN
  notes_has_tags ON notes_has_tags.note = notes.id
LEFT JOIN
  tags ON notes_has_tags.tag = tags.id
GROUP BY
  notes.id

In MySQL kann man das Ergebnis nun einfach als CSV exportieren (und darauf achten, dass man das Semikolon als Spaltentrenner verwendet).

In WordPress kann man das CSV nun absolut simpel mit dem „Wp Ultimate CSV Importer“ importieren. Dieser erkennt die Komma-separierten Tags und kommt auch mit Zeilenumbrüchen in CSV Files klar. Allerdings will man womöglich darauf achten, dass man diese Postings nicht als Draft importiert – sonst geht der Veröffentlichungszeitpunkt verloren.

Alle MyISAM Tabellen umwandeln

Wenn man alle Tabellen umwandeln will, ist es vermutlich ziemlich ätzend, jede einzeln umzuwandeln. Mit diesem Query kann man sich eine Reihe von SQL-Queries erstellen lassen, die alle Tabellen in ‚datenbankname‘ umwandelt.

SELECT CONCAT('ALTER TABLE ',table_schema ,'.',table_name,' ENGINE=InnoDB;')
FROM information_schema.tables
WHERE table_type='BASE TABLE' AND engine != 'InnoDB'
  AND table_schema = 'datenbankname'

Mit etwas Kreativität lässt sich dieses Schema auch auf andere Tabellenänderungen anwenden.