Comment sortir les résultats d'une requête MySQL au format CSV ?

Existe-t-il un moyen simple d'exécuter une requête MySQL à partir de la ligne de commande Linux et d'afficher les résultats au format [CSV][1] ?

Voici ce que je fais actuellement :

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

Cela devient compliqué quand il y a beaucoup de colonnes qui doivent être entourées de guillemets, ou si les résultats contiennent des guillemets qui doivent être échappés.

[1] : http://en.wikipedia.org/wiki/Comma-separated_values

Solution

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';

En utilisant cette commande, les noms des colonnes ne seront pas exportés.

Notez également que /var/lib/mysql-files/orders.csv sera sur le serveur qui exécute MySQL. L'utilisateur sous lequel le processus MySQL est exécuté doit avoir les droits d'écriture sur le répertoire choisi, ou la commande échouera.

Si vous souhaitez écrire la sortie sur votre machine locale à partir d'un serveur distant (en particulier une machine hébergée ou virtualisée telle que Heroku ou Amazon RDS), cette solution n'est pas adaptée.

Commentaires (31)

mysql --batch, -B

Imprimer les résultats en utilisant la tabulation comme séparateur de colonnes, avec chaque ligne sur une > nouvelle ligne. nouvelle ligne. Avec cette option, mysql n'utilise pas le fichier d'historique. Le mode batch entraîne un format de sortie non tabulaire et l'échappement des caractères spéciaux. caractères spéciaux. L'échappement peut être désactivé en utilisant le mode brut ; voir la description de la commande --raw. la description de l'option --raw.

Cela vous donnera un fichier séparé par des tabulations. Comme les virgules (ou les chaînes contenant des virgules) ne sont pas échappées, il n'est pas simple de changer le délimiteur en virgule.

Commentaires (9)

En alternative à la réponse ci-dessus, vous pouvez avoir une table MySQL qui utilise le moteur CSV.

Vous aurez alors un fichier sur votre disque dur qui sera toujours au format CSV et que vous pourrez simplement copier sans le traiter.

Commentaires (2)