Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL despeja em arquivos de texto CSV com nomes de colunas no topo?


Eu descobri uma maneira de ter que inserir manualmente esses nomes, desde que você esteja executando o MySQL 5 ou superior. Aqui está, escrito como um script bash para execução em uma linha de 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

Embora não seja a solução mais graciosa, tenho certeza que pode ser compactada em uma única linha por alguém que conhece SQL e/ou bash um pouco melhor do que eu ...

O que ele faz é:
  1. usa o esquema de informações do MySQL para criar um CSV vazio com cabeçalhos de coluna
  2. anexa uma nova linha extra a esse CSV vazio para que seus dados comecem a aparecer em uma nova linha
  3. usa uma consulta padrão "SELECT * INTO OUTFILE..." para criar um CSV cheio de dados
  4. anexa o arquivo de dados ao arquivo com cabeçalhos de coluna
  5. exclui o arquivo de dados (temporário)

Boa sorte, e se você limpar, poste seus resultados!