Achtergrond

Een snel in elkaar gehackt Python-script om mysqldump-bestanden om te zetten in CSV-bestanden. Geoptimaliseerd voor Wikipedia database dumps.

Extra grote MySQL dumps kunnen moeilijk of onmogelijk te importeren zijn op vrij beperkte hardware. Het vervelende van een MySQL dump is dat de enige praktische manier om deze te manipuleren via MySQL is, wat in wezen een hardware upgrade vereist als men wil werken met grote dumps zoals de Wikipedia MySQL dumps.

Zou het niet geweldig zijn als er een manier was om het MySQL dump formaat (wat een reeks INSERT statements is) te converteren naar een universeel formaat… zoals… CSV?

Wel, nu is er.

Dit korte Python script maakt gebruik van het feit dat de structuur van een MySQL INSERT statement niet al te veel verschilt van CSV, en gebruikt de Python CSV parser (voor en na wat tekst wrangling) om het MySQL dump bestand om te zetten in een CSV bestand.

Gebruik

Just run python mysqldump_to_csv.py gevolgd door de bestandsnaam van een SQL bestand. U kunt meerdere SQL-bestanden opgeven, en ze zullen allemaal worden samengevoegd in één CSV-bestand. Dit script kan ook SQL-bestanden van standaard input ontvangen, wat handig kan zijn om van een gzipped MySQL dump een CSV-bestand te maken zonder de MySQL dump te uncomprimeren.

zcat dumpfile.sql.gz | python mysqldump_to_csv.py

Hoe het werkt

De volgende SQL:

INSERT INTO `page` VALUES (1,0,'April','',1,0,0,0.778582929065,'20140312223924','20140312223929',4657771,20236,0),(2,0,'August','',0,0,0,0.123830928525,'20140312221818','20140312221822',4360163,11466,0);

wordt omgezet in de volgende CSV:

1,0,April,1,0,0,0.778582929065,20140312223924,20140312223929,4657771,20236,02,0,August,0,0,0,0.123830928525,20140312221818,20140312221822,4360163,11466,0

Het is niet al te moeilijk om te zien wat er gebeurt, maar u kunt zeker naar de broncode kijken om te zien hoe de transformatie precies wordt gemaakt.

Todo

  • Een rigoureuze serie unit tests, die bewijzen dat dit werkt op een diverse set MySQL dump files zonder neveneffecten
  • Een beetje meer documentatie
  • Een oplossing voor een bug waarbij de ene kolom een string is die eindigt op ) en de volgende kolom een string is die begint op (. De huidige programma logica suggereert dat de haakjes zouden worden gestript.