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