Il peut arriver que l’ on aie besoin d’ exécuter une requête en ligne de commande, de manière non-interactive (c’ est-à-dire sans avoir à se connecter au serveur, puis à taper la requête par exemple). Cela peut servir à rendre scriptable l’ exécution de la requête par exemple. Dans ce cas, ou pour tout simplement exécuter une requête depuis un shell, il existe plusieurs possibilités:
- depuis le serveur mysql, si la requête est à taper ou à copier/coller directement sur la ligne de commande:
$> mysql <base> -h <host> -u <user> -p<password> -e "requête" OU $> echo "requête" | mysql <base> -h <host> -u <user> -p<password>
si la requête à exécuter est dans un fichier texte (nommé req.sql ici):
$> mysql <base> -h <host> -u <user> -p<password> < req.sql
A titre informatif, la version avec l’option « -e » ci-dessus est la seule a formater la sortie dans un tableau ASCII avec des bordures. Voici un exemple de sortie:
+----+------------------------------------+ | id | adresse | +----+------------------------------------+ | 2 | 31 Route La Font du Pin | | 3 | 18 bis Rue du Sudre | | 4 | 57 Rue Théodore Bellemer | ... +----+------------------------------------+
Les autres versions présentent la sortie de manière plus brute:
id adresse 2 31 Route La Font du Pin 3 18 bis Rue du Sudre 4 57 Rue Théodore Bellemer ...
Accessoirement, pour récupérer le résultat de la requête dans un fichier (out.txt ici), il suffit de rajouter une redirection de la sortie:
$> mysql <base> -h <host> -u <user> -p<password> -e "requete" > out.txt
Pour exporter la sortie au format CSV, dans un fichier « /chemin/vers/out.csv » par exemple, il suffit d’ ajouter ce code à la fin de la requête:
[...] INTO OUTFILE '/chemin/vers/out.csv' FIELDS ENCLOSED BY '\"' TERMINATED BY ';' ESCAPED BY '\"' LINES TERMINATED BY '\r\n';
Il est possible que le serveur mySQL vous interdise cette possibilité s’il a été lancé avec l’option « –secure-file-priv ». Dans ce cas, il sera peut être nécessaire de vous y connecter de manière interactive et de lancer la requête suivante:
SHOW VARIABLES LIKE "secure_file_priv";
Le résultat vous montrera les chemins autorisés pour les exports de fichier, dans mon cas, j’ai obtenu:
+------------------+-----------------------+ | Variable_name | Value | +------------------+-----------------------+ | secure_file_priv | /var/lib/mysql-files/ | +------------------+-----------------------+
Donc, le « /chemin/vers/out.csv » au-dessus, doit être remplacé par « /var/lib/mysql-files/out.csv ».
- Si on n’ est pas sur le serveur mysql, mais qu’ on y possède un accès via ssh:
ssh <login@serveur.mysql.domaine> "mysql <base> -h <host> -u <user> -p<password> -e 'requete'"