Baggrund

Et hurtigt-hacked-together Python-script til at forvandle mysqldump-filer til CSV-filer. Optimeret til Wikipedia-databasedumps.

Extraordinært store MySQL-dumps kan være vanskelige eller umulige at importere på ret begrænset hardware. Det irriterende ved et MySQL-dump er, at den eneste praktiske måde at manipulere det på er gennem MySQL, hvilket i bund og grund kræver en hardwareopgradering, hvis man ønsker at arbejde med store dumps som Wikipedia MySQL-dumps.

Vil det ikke være fantastisk, hvis der var en måde at konvertere MySQL-dump-formatet (som er en række INSERT-statements) til et universelt format… som… CSV?

Nu er der det.

Dette korte Python-script udnytter det faktum, at strukturen af en MySQL INSERT-anvisning ikke er alt for forskellig fra CSV, og bruger Pythons CSV-parser (før og efter en vis tekstforvrængning) til at omdanne MySQL-dumpfilen til en CSV-fil.

Anvendelse

Du skal bare køre python mysqldump_to_csv.py efterfulgt af filnavnet på en SQL-fil. Du kan angive flere SQL-filer, og de vil alle blive sammenkædet til én CSV-fil. Dette script kan også modtage SQL-filer fra standardinput, hvilket kan være nyttigt til at omdanne et gzippet MySQL-dump til en CSV-fil uden at udpakke MySQL-dumpet.

zcat dumpfile.sql.gz | python mysqldump_to_csv.py

Sådan fungerer det

Følgende 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);

omdannes til følgende 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 er ikke så svært at se, hvad der foregår, men du kan helt sikkert kigge på kildekoden for at se præcis, hvordan omdannelsen foretages.

Todo

  • En streng serie af enhedstests, der beviser, at dette virker på et varieret sæt MySQL-dumpfiler uden bivirkninger
  • En del mere dokumentation
  • En løsning på en fejl, hvor den ene kolonne er en streng, der slutter på ), og den næste kolonne er en streng, der starter på (. Den nuværende programlogik antyder, at parenteserne ville blive fjernet.