Frage Wie kann ich MySQL-Abfrageergebnisse im CSV-Format ausgeben?


Gibt es eine einfache Möglichkeit, eine MySQL-Abfrage über die Linux-Befehlszeile auszuführen und die Ergebnisse auszugeben? CSV  Format?

Hier ist, was ich gerade mache:

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

Es wird unordentlich, wenn viele Spalten von Anführungszeichen umgeben sein müssen oder wenn in den Ergebnissen Anführungszeichen enthalten sind, die mit Escapezeichen versehen werden müssen.


932
2017-12-10 15:59


Ursprung


Antworten:


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

Mit diesem Befehl werden Spaltennamen nicht exportiert.

Beachten Sie auch das /var/lib/mysql-files/orders.csv wird auf dem sein Server das läuft mit MySQL. Der Benutzer, unter dem der MySQL-Prozess läuft, muss über Berechtigungen zum Schreiben in das ausgewählte Verzeichnis verfügen, sonst schlägt der Befehl fehl.

Wenn Sie die Ausgabe von einem Remote-Server (insbesondere einem gehosteten oder virtualisierten Computer wie Heroku oder Amazon RDS) auf Ihren lokalen Computer schreiben möchten, ist diese Lösung nicht geeignet.


1425
2017-12-10 16:07



$ mysql your_database --password=foo < my_requests.sql > out.csv

Welches ist Tab getrennt. Pipe es so, um eine echte CSV zu erhalten (Danke @hierfür hier):

... .sql | sed 's/\t/,/g' > out.csv

359
2018-04-08 16:53



mysql --batch, -B

Drucken Sie die Ergebnisse über die Registerkarte als Spaltentrennzeichen, wobei jede Zeile auf a steht   Neue Zeile. Mit dieser Option verwendet mysql die Verlaufsdatei nicht.   Der Batch-Modus führt zu einem nicht tabellarischen Ausgabeformat und zu einem Escaping von   spezielle Charaktere. Escaping kann durch Verwendung des Raw-Modus deaktiviert werden; sehen   die Beschreibung für die Option --raw.

Dadurch erhalten Sie eine tabulatorgetrennte Datei. Da Kommas (oder Zeichenfolgen, die Kommas enthalten) nicht maskiert sind, ist es nicht einfach, das Trennzeichen in Komma zu ändern.


170
2017-09-30 10:51



Hier ist eine ziemlich gnadenhafte Art, es zu tun. Irgendwo gefunden, kann keinen Kredit nehmen

mysql --user=wibble --password wobble -B -e "select * from vehicle_categories;" | sed "s/'/\'/;s/\t/\",\"/g;s/^/\"/;s/$/\"/;s/\n//g" > vehicle_categories.csv

Funktioniert ziemlich gut. Wieder einmal beweist eine Regex nur schreiben.


Regex Erläuterung:

  • s /// bedeutet ersetzen, was zwischen dem ersten // mit dem ist, was zwischen dem zweiten //
  • das "g" am Ende ist ein Modifikator, der "alle Instanz, nicht nur zuerst" bedeutet
  • ^ (in diesem Zusammenhang) bedeutet Anfang der Linie
  • $ (in diesem Zusammenhang) bedeutet Ende der Zeile

Also, alles zusammensetzen:

s/'/\'/          replace ' with \'
s/\t/\",\"/g     replace all \t (tab) with ","
s/^/\"/          at the beginning of the line place a "
s/$/\"/          at the end of the line place a "
s/\n//g          replace all \n (newline) with nothing

112
2018-03-22 17:31



Unix /Cygwin nur, schicke es durch 'tr':

mysql <database> -e "<query here>" | tr '\t' ',' > data.csv

N.B .: Dies behandelt weder eingebettete Kommas noch eingebettete Registerkarten.


68
2017-10-11 15:19



Die von Paul Tomblin angegebene OUTFILE-Lösung bewirkt, dass eine Datei auf den MySQL-Server selbst geschrieben wird. Dies funktioniert nur, wenn Sie dies getan haben DATEI Zugriff, sowie Login-Zugriff oder andere Mittel zum Abrufen der Datei aus dieser Box.

Wenn Sie keinen solchen Zugriff haben und die durch Tabulatoren getrennte Ausgabe einen sinnvollen Ersatz für CSV darstellt (z. B. wenn Ihr Endziel ein Import nach Excel ist), dann wird die Lösung von Serbaut (unter Verwendung von mysql --batch und optional --raw) ist der Weg zu gehen.


33
2018-06-22 13:48



Wie wäre es mit:

mysql your_database -p < my_requests.sql | awk '{print $1","$2}' > out.csv

30
2017-11-10 18:41



Das hat mich ein paar Mal gerettet. Schnell und es funktioniert!

--Stapel

--roh

Beispiel:

sudo mysql -udemo_user -p -h127.0.0.1 --port=3306 \
   --default-character-set=utf8 --database=demo_database \
   --batch --raw < /var/demo_sql_query.sql > /var/demo_csv_export.csv

30
2018-01-29 13:52



MySQL Workbench kann Recordsets in CSV exportieren, und es scheint, Kommas in Feldern sehr gut zu behandeln. Die CSV öffnet sich in OpenOffice.


28
2018-06-26 17:15



Bis auf die Mysql-Workbench sind alle bisherigen Lösungen falsch und möglicherweise unsicher (dh Sicherheitsprobleme) für zumindest möglichen Inhalt in der mysql-db.

Mysql Workbench (und ähnlich PHPMyAdmin) bieten eine formal korrekte Lösung, sind aber dafür gedacht, die Ausgabe an den Ort eines Benutzers herunterzuladen. Sie sind nicht so nützlich für Dinge wie die Automatisierung des Datenexports.

Es ist nicht möglich, zuverlässig korrektes csv aus der Ausgabe von zu generieren mysql -B -e 'SELECT ...' weil das Wagenrücklauf und Leerraum in Feldern nicht kodieren kann. Das Flag '-s' für mysql führt Backslashs aus und kann zu einer korrekten Lösung führen. Die Verwendung einer Skriptsprache (eine mit vernünftigen internen Datenstrukturen, also keine bash) und Bibliotheken, in denen die Codierungsprobleme bereits sorgfältig ausgearbeitet wurden, sind weitaus sicherer.

Ich dachte daran, ein Skript dafür zu schreiben, aber sobald ich darüber nachdachte, wie ich es nennen würde, kam ich auf die Suche nach bereits existierenden Arbeiten mit dem gleichen Namen. Während ich es nicht gründlich durchgegangen bin, ist die Lösung bei https://github.com/robmiller/mysql2csv sieht vielversprechend aus. Abhängig von Ihrer Anwendung mag der yaml-Ansatz zum Angeben der SQL-Befehle möglicherweise ansprechend sein oder auch nicht. Ich bin auch nicht begeistert von der Notwendigkeit einer neueren Version von Ruby, die standardmäßig mit meinem Ubuntu 12.04 Laptop oder Debian Squeeze Servern geliefert wird. Ja, ich weiß, ich könnte RVM benutzen, aber ich möchte das nicht für so einen einfachen Zweck beibehalten.

Hoffentlich wird jemand auf ein geeignetes Tool hinweisen, das ein bisschen getestet wurde. Ansonsten werde ich das wahrscheinlich aktualisieren, wenn ich einen finde oder schreibe.


23
2017-10-11 05:04



Von deiner Befehlszeile du kannst das:

mysql -h *hostname* -P *port number* --database=*database_name* -u *username* -p -e *your SQL query* | sed 's/\t/","/g;s/^/"/;s/$/"/;s/\n//g' > *output_file_name.csv*

Credits:  Tabelle von Amazon RDS in eine CSV-Datei exportieren


19
2018-06-25 06:50