Bakgrund

Ett snabbt ihophackat Python-skript för att omvandla mysqldump-filer till CSV-filer. Optimerad för Wikipedia-databasdumpar.

Extraordinärt stora MySQL-dumpar kan vara svåra eller omöjliga att importera på ganska begränsad hårdvara. Det irriterande med en MySQL-dump är att det enda praktiska sättet att manipulera den är genom MySQL, vilket i huvudsak kräver en hårdvaruuppgradering om man vill arbeta med stora dumpar som Wikipedias MySQL-dumpar.

Vore det inte fantastiskt om det fanns något sätt att konvertera MySQL-dumpformatet (som är en serie INSERT-anvisningar) till ett universellt format… som… CSV?

Ja, nu finns det.

Detta korta Python-skript utnyttjar det faktum att strukturen på ett MySQL INSERT-uttalande inte skiljer sig alltför mycket från CSV, och använder Pythons CSV-analysator (före och efter viss textförvrängning) för att förvandla MySQL-dumpfilen till en CSV-fil.

Användning

Kör bara python mysqldump_to_csv.py följt av filnamnet på en SQL-fil. Du kan ange flera SQL-filer och de kommer alla att sammanfogas till en CSV-fil. Det här skriptet kan också ta emot SQL-filer från standardinmatning, vilket kan vara användbart för att omvandla en gzippad MySQL-dump till en CSV-fil utan att MySQL-dumpen behöver komprimeras.

zcat dumpfile.sql.gz | python mysqldump_to_csv.py

Hur det fungerar

Följande 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);

omvandlas till följande 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

Det är inte alltför svårt att se vad som händer, men du kan säkert titta på källkoden för att se exakt hur omvandlingen görs.

Todo

  • En rigorös serie enhetstester som bevisar att detta fungerar på en varierad uppsättning MySQL-dumpfiler utan några bieffekter
  • En del mer dokumentation
  • En lösning på ett fel där en kolumn är en sträng som slutar på ) och nästa kolumn är en sträng som börjar på (. Den nuvarande programlogiken tyder på att parenteserna skulle tas bort.