Como sair os resultados da consulta MySQL no formato CSV?

Existe uma maneira fácil de executar uma consulta MySQL a partir da linha de comando do Linux e emitir os resultados no formato CSV ?

Aqui'é o que eu'estou a fazer agora:

mysql -u uid -ppwd -D dbname << EOQ | sed -e 's/        /,/g' | tee list.csv
select id, concat("\"",name,"\"") as name
from students
EOQ

Fica confuso quando há muitas colunas que precisam ser cercadas por aspas, ou se há aspas nos resultados que precisam ser contornadas.

Solução

A partir de http://www.tech-recipes.com/rx/1475/save-mysql-query-results-into-a-text-or-csv-file/

SELECT order_id,product_name,qty
FROM orders
WHERE foo = 'bar'
INTO OUTFILE '/var/lib/mysql-files/orders.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';

Usando este comando, os nomes das colunas não serão exportados.

Note também que /var/lib/mysql-files/orders.csv estará no server que está rodando o MySQL. O usuário sob o qual o processo MySQL está rodando deve ter permissões para escrever no diretório escolhido, ou o comando irá falhar.

Se você quiser escrever a saída para sua máquina local a partir de um servidor remoto (especialmente uma máquina hospedada ou virtualizada, como Heroku ou Amazon RDS), esta solução não é adequada.

Comentários (31)

mysql --batch, -B

Imprimir resultados usando a guia como separador de colunas, com cada linha em um nova linha. Com esta opção, mysql não utiliza o arquivo de histórico. O modo batch resulta em formato de saída não tabular e fuga de caracteres especiais. A fuga pode ser desactivada utilizando o modo em bruto; ver a descrição para a opção --raw.

Isto dar-lhe-á um ficheiro separado por tabulação. Como as vírgulas (ou cordas contendo vírgulas) não escapam, não é fácil mudar o delimitador para vírgula.

Comentários (9)

Alternativamente à resposta acima, você pode ter uma tabela MySQL que utiliza o motor CSV.

Então você terá um arquivo no seu disco rígido que estará sempre em formato CSV, que você poderia simplesmente copiar sem processá-lo.

Comentários (2)