sql >> Base de Datos >  >> RDS >> Mysql

MySQL volcado en archivos de texto CSV con nombres de columna en la parte superior?

Descubrí una forma de evitar tener que ingresar manualmente esos nombres siempre que esté ejecutando MySQL 5 o superior. Aquí está, escrito como un script bash para ejecutarse en una línea de comandos de 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

Si bien no es la solución más elegante, estoy seguro de que puede comprimirse en una sola línea por alguien que sepa SQL y/o bash un poco mejor que yo...

Lo que hace es:

  1. utiliza el esquema de información de MySQL para crear un CSV vacío con encabezados de columna
  2. añade una nueva línea adicional a ese CSV vacío para que sus datos comiencen a aparecer en una nueva línea
  3. utiliza una consulta bastante estándar "SELECT * INTO OUTFILE..." para crear un CSV lleno de datos
  4. añade el archivo de datos al archivo con encabezados de columna
  5. borra el archivo de datos (temporal)

Buena suerte, y si lo limpias, ¡publica tus resultados!