Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL esegue il dump in file di testo CSV con i nomi delle colonne in alto?

Ho trovato un modo per evitare di dover inserire manualmente quei nomi fintanto che stai utilizzando MySQL 5 o versioni successive. Eccolo, scritto come uno script bash per l'esecuzione su una riga di comando unix:

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

Sebbene non sia la soluzione più aggraziata, sono sicuro che può essere compressa in una singola riga da qualcuno che conosce SQL e/o bash un po' meglio di me...

Quello che fa è:

  1. utilizza lo schema di informazioni di MySQL per creare un CSV vuoto con intestazioni di colonna
  2. aggiunge una nuova riga in più a quel CSV vuoto in modo che i tuoi dati inizino ad apparire in una nuova riga
  3. utilizza una query "SELECT * INTO OUTFILE..." piuttosto standard per creare un CSV pieno di dati
  4. aggiunge il file di dati al file con le intestazioni di colonna
  5. elimina il file di dati (temporaneo)

Buona fortuna e, se lo pulisci, pubblica i risultati!