Come produrre i risultati delle query MySQL in formato CSV?

C'è un modo semplice per eseguire una query MySQL dalla riga di comando di Linux e produrre i risultati in formato CSV?

Ecco cosa sto facendo ora:

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

Diventa un casino quando ci sono molte colonne che hanno bisogno di essere circondate da virgolette, o se ci sono virgolette nei risultati che devono essere evase.

Soluzione

Da 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 questo comando i nomi delle colonne non saranno esportati.

Nota anche che /var/lib/mysql-files/orders.csv sarà sul server che sta eseguendo MySQL. L'utente che sta eseguendo il processo MySQL deve avere i permessi per scrivere nella directory scelta, o il comando fallirà.

Se vuoi scrivere l'output sulla tua macchina locale da un server remoto (specialmente una macchina ospitata o virtualizzata come Heroku o Amazon RDS), questa soluzione non è adatta.

Commentari (31)

mysql --batch, -B

Stampa i risultati usando il tab come separatore di colonna, con ogni riga su una nuova linea. Con questa opzione, mysql non usa il file della cronologia. La modalità batch comporta un formato di output non tabellare e l'escaping dei caratteri speciali. L'escape può essere disabilitato usando la modalità raw; vedi la descrizione dell'opzione --raw.

Questo ti darà un file separato da tabulazioni. Poiché le virgole (o le stringhe contenenti virgole) non sono sottoposte a escape, non è semplice cambiare il delimitatore in virgola.

Commentari (9)

In alternativa alla risposta di cui sopra, si può avere una tabella MySQL che utilizza il motore CSV.

Poi avrai un file sul tuo hard disk che sarà sempre in formato CSV che potresti semplicemente copiare senza elaborarlo.

Commentari (2)