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.
Lämna ett svar