Mysql
 sql >> Base de données >  >> RDS >> Mysql

Décharge MySQL dans des fichiers texte CSV avec les noms de colonne en haut ?

J'ai trouvé un moyen de contourner la saisie manuelle de ces noms tant que vous utilisez MySQL 5 ou une version ultérieure. Le voici, écrit sous la forme d'un script bash pour s'exécuter sur une ligne de commande 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

Bien que ce ne soit pas la solution la plus élégante, je suis sûr qu'elle peut être compressée en une seule ligne par quelqu'un qui connaît SQL et/ou bash un peu mieux que moi...

Ce qu'il fait est :

  1. utilise le schéma d'informations de MySQL pour créer un CSV vide avec des en-têtes de colonne
  2. ajoute une nouvelle ligne supplémentaire à ce CSV vide afin que vos données commencent à apparaître sur une nouvelle ligne
  3. utilise une requête assez standard "SELECT * INTO OUTFILE..." pour créer un CSV plein de données
  4. ajoute le fichier de données au fichier avec les en-têtes de colonne
  5. supprime le fichier de données (temporaire)

Bonne chance, et si vous le nettoyez, publiez vos résultats !