sql >> Database >  >> RDS >> Mysql

MySQL-dump in CSV-tekstbestanden met kolomnamen bovenaan?

Ik heb een manier gevonden om die namen handmatig in te voeren, zolang je MySQL 5 of hoger gebruikt. Hier is het, geschreven als een bash-script om op een Unix-opdrachtregel te draaien:

DBNAME=<database_name>
TABLE=<table_name>

FNAME=/path/to/output/dir/$(date +%Y.%m.%d)-$DBNAME.csv

#(1)creates empty file and sets up column names using the information_schema
mysql -u <username> -p<password> $DBNAME -B -e "SELECT COLUMN_NAME FROM information_schema.COLUMNS C WHERE table_name = '$TABLE';" | awk '{print $1}' | grep -iv ^COLUMN_NAME$ | sed 's/^/"/g;s/$/"/g' | tr '\n' ',' > $FNAME

#(2)appends newline to mark beginning of data vs. column titles
echo "" >> $FNAME

#(3)dumps data from DB into /var/mysql/tempfile.csv
mysql -u <username> -p<password> $DBNAME -B -e "SELECT * INTO OUTFILE '/var/mysql/tempfile.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' FROM $TABLE;"

#(4)merges data file and file w/ column names
cat /var/mysql/tempfile.csv >> $FNAME

#(5)deletes tempfile
rm -rf /var/mysql/tempfile.csv

Hoewel het niet de meest gracieuze oplossing is, weet ik zeker dat het in een enkele regel kan worden gecomprimeerd door iemand die SQL en/of bash een beetje beter kent dan ik...

Wat het doet is:

  1. gebruikt het informatieschema van MySQL om een ​​lege CSV met kolomkoppen te maken
  2. voegt een extra nieuwe regel toe aan die lege CSV zodat uw gegevens als een nieuwe regel verschijnen
  3. gebruikt een vrij standaard "SELECT * INTO OUTFILE..."-query om een ​​CSV vol gegevens te maken
  4. voegt het gegevensbestand toe aan het bestand met kolomkoppen
  5. verwijdert het (tijdelijke) gegevensbestand

Veel succes, en als je het opruimt, post dan je resultaten!



  1. MySQL - UPDATE-query met SET-instructie afhankelijk van de uitkomst van de vorige SET-instructie

  2. mysql-volgorde per probleem

  3. Werken met Salesforce.com in Alpha Anywhere

  4. android/php record wordt niet ingevoegd in mysql