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.
Skriv et svar