Apakah ada cara mudah untuk menjalankan kueri MySQL dari baris perintah Linux dan menampilkan hasilnya dalam format CSV ?
Inilah yang saya lakukan sekarang:
mysql -u uid -ppwd -D dbname << EOQ | sed -e 's/ /,/g' | tee list.csv
select id, concat("\"",name,"\"") as name
from students
EOQ
Itu menjadi berantakan ketika ada banyak kolom yang perlu dikelilingi oleh tanda kutip, atau jika ada tanda kutip dalam hasil yang perlu diloloskan.
REPLACE()
dalam kueri Anda untuk mendapatkan penawaran.Jawaban:
Dari http://www.tech-recipes.com/rx/1475/save-mysql-query-result-into-a-text-or-csv-file/
Menggunakan perintah ini kolom nama tidak akan diekspor.
Perhatikan juga bahwa
/var/lib/mysql-files/orders.csv
akan berada di server yang menjalankan MySQL. Pengguna yang menjalankan proses MySQL harus memiliki izin untuk menulis ke direktori yang dipilih, atau perintah akan gagal.Jika Anda ingin menulis keluaran ke mesin lokal Anda dari server jauh (terutama mesin yang dihosting atau divirtualkan seperti Heroku atau Amazon RDS), solusi ini tidak cocok.
sumber
Yang dipisahkan tab. Pipa seperti itu untuk mendapatkan CSV yang benar (terima kasih @therefromhere):
sumber
| sed 's/\t/,/g'
Ini akan memberi Anda file yang dipisahkan tab. Karena koma (atau string yang mengandung koma) tidak lolos, tidak mudah untuk mengubah pembatas menjadi koma.
sumber
Inilah cara yang cukup sulit untuk melakukannya. Ditemukan di suatu tempat, tidak dapat mengambil kredit
mysql --user=wibble --password wobble -B -e "select * from vehicle_categories;" | sed "s/'/\'/;s/\t/\",\"/g;s/^/\"/;s/$/\"/;s/\n//g" > vehicle_categories.csv
Bekerja dengan cukup baik. Sekali lagi meskipun regex hanya membuktikan menulis.
Penjelasan Regex:
Jadi, kumpulkan semuanya:
sumber
mysql -B
. Jika Anda memisahkan regex menjadi pernyataan individual pada baris terpisah, itu akan cukup sederhana (untuk seseorang yang tahu regex) untuk memahaminya.","
,, dan sejumlah hal lainnya. Regex bukanlah cara untuk menyelesaikan masalah iniHanya Unix / Cygwin , pipa melalui 'tr':
NB: Ini tidak menangani koma yang disematkan, atau tab yang disematkan.
sumber
Ini menyelamatkan saya beberapa kali. Cepat dan berhasil!
Contoh:
Untuk kelengkapan, Anda dapat mengonversi ke csv (tapi hati-hati karena tab bisa berada di dalam nilai bidang - misalnya bidang teks)
sumber
Solusi OUTFILE yang diberikan oleh Paul Tomblin menyebabkan file ditulis di server MySQL itu sendiri, jadi ini hanya akan berfungsi jika Anda memiliki FILE akses , serta akses masuk atau cara lain untuk mengambil file dari kotak itu.
Jika Anda tidak memiliki akses seperti itu, dan keluaran yang dibatasi-tab adalah pengganti yang wajar untuk CSV (mis., Jika tujuan akhir Anda adalah mengimpor ke Excel), maka solusi Serbaut (menggunakan
mysql --batch
dan opsional--raw
) adalah cara yang harus dilakukan.sumber
MySQL Workbench dapat mengekspor set rekaman ke CSV, dan tampaknya menangani koma di bidang dengan sangat baik. CSV terbuka di OpenOffice fine.
sumber
Bagaimana tentang:
sumber
mysql -uUser -pPassword your_database < my_requests.sql | awk 'BEGIN{OFS="=";} {print $1,$2}' > out.csv
Semua solusi di sini sampai saat ini, kecuali satu workbench MySQL, salah dan sangat mungkin tidak aman (yaitu masalah keamanan) untuk setidaknya beberapa konten yang mungkin di mysql db.
MYSQL Workbench (dan juga PHPMyAdmin) memberikan solusi yang benar secara formal, tetapi dirancang untuk mengunduh output ke lokasi pengguna. Mereka tidak begitu berguna untuk hal-hal seperti mengotomatisasi ekspor data.
Tidak mungkin untuk menghasilkan csv yang benar andal dari output
mysql -B -e 'SELECT ...'
karena tidak dapat menyandikan carriage return dan ruang putih di bidang. Bendera '-s' ke mysql tidak menghilangkan backslash, dan mungkin mengarah ke solusi yang benar. Namun, menggunakan bahasa scripting (yang dengan struktur data internal yang layak, bukan bash), dan perpustakaan di mana masalah pengkodean telah dipecahkan dengan hati-hati jauh lebih aman.Saya berpikir untuk menulis skrip untuk ini, tetapi segera setelah saya memikirkan apa yang saya sebut, terpikir oleh saya untuk mencari karya yang sudah ada sebelumnya dengan nama yang sama. Meskipun saya belum membahasnya secara menyeluruh, solusi di https://github.com/robmiller/mysql2csv terlihat menjanjikan. Tergantung pada aplikasi Anda, pendekatan yaml untuk menentukan perintah SQL mungkin atau mungkin tidak menarik. Saya juga tidak senang dengan persyaratan untuk versi ruby yang lebih baru daripada datang sebagai standar dengan laptop Ubuntu 12,04 saya atau server Debian Squeeze. Ya saya tahu saya bisa menggunakan RVM, tapi saya lebih suka tidak mempertahankannya untuk tujuan yang sederhana.
Semoga seseorang akan menunjukkan alat yang cocok, yang telah sedikit diuji. Kalau tidak, saya mungkin akan memperbarui ini ketika saya menemukan atau menulis satu.
sumber
Banyak jawaban di halaman ini lemah karena mereka tidak menangani kasus umum tentang apa yang dapat terjadi dalam format CSV. mis. koma dan kutipan tertanam di bidang dan kondisi lain yang selalu muncul akhirnya. Kami membutuhkan solusi umum yang berfungsi untuk semua data input CSV yang valid.
Berikut adalah solusi sederhana dan kuat dalam Python:
Beri nama file itu
tab2csv
, letakkan di jalur Anda, berikan izin eksekusi, lalu gunakan seperti ini:Fungsi penanganan CSV Python mencakup kasus sudut untuk format input CSV.
Ini dapat ditingkatkan untuk menangani file yang sangat besar melalui pendekatan streaming.
sumber
Dari baris perintah Anda, Anda dapat melakukan ini:
Kredit: Mengekspor tabel dari Amazon RDS ke file csv
sumber
CREATE TABLE () (SELECT data FROM other_table ) ENGINE=CSV ;
sumber
Jawaban ini menggunakan Python dan perpustakaan pihak ketiga yang populer, PyMySQL . Saya menambahkan karena Python csv perpustakaan cukup kuat untuk benar menangani banyak rasa yang berbeda dari
.csv
dan tidak ada jawaban lainnya menggunakan kode Python untuk berinteraksi dengan database.sumber
Ini sederhana, dan berfungsi pada apa pun tanpa perlu mode batch atau file output:
Penjelasan:
"
dengan""
di setiap bidang ->replace(field1, '"', '""')
concat('"', result1, '"')
concat_ws(',', quoted1, quoted2, ...)
Itu dia!
sumber
NULL
nilai akan dilewati olehconcat_ws()
, menghasilkan ketidakcocokan kolom. Untuk menghindari ini, cukup gunakan string kosong sebagai gantinya:IFNULL(field, '')
(atau apa pun yang Anda gunakan untuk mewakiliNULL
)Atau dengan jawaban di atas, Anda dapat memiliki tabel MySQL yang menggunakan mesin CSV.
Kemudian Anda akan memiliki file di hard disk Anda yang akan selalu dalam format CSV yang bisa Anda salin tanpa memprosesnya.
sumber
Untuk memperluas jawaban sebelumnya, satu-baris berikut ini mengekspor satu tabel sebagai file yang dipisahkan dengan tab. Ini cocok untuk otomatisasi, mengekspor database setiap hari atau lebih.
Dengan mudah, kita dapat menggunakan teknik yang sama untuk membuat daftar tabel MySQL, dan untuk menggambarkan bidang pada satu tabel:
sumber
mysql -B -D mydatabase -e 'select * from mytable' | sed -e 's/\t/,/g'
sed -e 's/\t/,/g'
hanya aman jika Anda yakin bahwa data Anda tidak mengandung koma atau tab.Membangun di user7610, di sini adalah cara terbaik untuk melakukannya. Dengan
mysql outfile
ada 60 menit kepemilikan file dan masalah menimpa.Itu tidak keren, tetapi bekerja dalam 5 menit.
php csvdump.php localhost root password database tablename > whatever-you-like.csv
sumber
Juga, jika Anda melakukan kueri pada baris perintah Bash, saya yakin
tr
perintah itu dapat digunakan untuk mengganti tab default menjadi pembatas yang berubah-ubah.$ echo "SELECT * FROM Table123" | mysql Database456 | tr "\t" ,
sumber
Inilah yang saya lakukan:
Script perl (diambil dari tempat lain) melakukan pekerjaan yang bagus untuk mengonversi tab spasi bidang ke CSV.
sumber
perl -F"\t" -lane 'print join ",", map {s/"/""/g; /^\d+(?:\.\d+)?$/ ? $_ : qq("$_")} @F '
- milik Anda tidak akan mengutip1.2.3
Tidak persis seperti format CSV, tetapi
tee
perintah dari klien MySQL dapat digunakan untuk menyimpan output ke file lokal :Anda dapat menonaktifkannya menggunakan
notee
.Masalahnya
SELECT … INTO OUTFILE …;
adalah bahwa itu memerlukan izin untuk menulis file di server.sumber
Menggunakan solusi yang diposting oleh Tim, saya membuat skrip bash ini untuk memudahkan proses (root password diminta, tetapi Anda dapat memodifikasi skrip dengan mudah untuk meminta pengguna lain):
Ini akan membuat file bernama: database.table.csv
sumber
Jika Anda memiliki PHP yang disiapkan di server, Anda dapat menggunakan mysql2csv untuk mengekspor file CSV (benar-benar valid) untuk permintaan mysql yang sangat besar. Lihat jawaban saya di MySQL - SELECT * INTO OUTFILE LOCAL? untuk lebih banyak konteks / info.
Saya mencoba mempertahankan nama opsi dari
mysql
sehingga cukup untuk menyediakan--file
dan--query
opsi:"Instal"
mysql2csv
melalui(unduh konten intinya, periksa checksum dan buat itu dapat dieksekusi).
sumber
Apa yang berhasil untuk saya:
Tidak ada solusi di utas ini bekerja untuk kasus khusus saya, saya punya data json cantik di salah satu kolom, yang akan kacau dalam output csv saya. Bagi mereka yang memiliki masalah serupa, coba baris yang diakhiri oleh \ r \ n sebagai gantinya.
Juga masalah lain bagi mereka yang mencoba untuk membuka csv dengan Microsoft Excel, perlu diingat ada batas 32.767 karakter yang dapat dimiliki oleh satu sel, di atas itu melimpah ke baris di bawah ini. Untuk mengidentifikasi catatan mana dalam kolom yang memiliki masalah, gunakan kueri di bawah ini. Anda kemudian dapat memotong catatan itu atau menanganinya seperti yang Anda inginkan.
sumber
Jika Anda mendapatkan kesalahan
secure-file-priv
saat itu, juga setelah menggeser lokasi file tujuan Anda di dalamC:\ProgramData\MySQL\MySQL Server 8.0\Uploads
dan juga setelah itu query-SELECT * FROM attendance INTO OUTFILE 'C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\FileName.csv' FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';
tidak berfungsi, Anda hanya perlu mengubah
\
(backsplash) dari kueri menjadi/
(forwardsplash)Dan itu berhasil !!
Contoh:
Setiap kali ketika Anda menjalankan kueri yang berhasil, itu akan menghasilkan file csv baru setiap kali! Keren kan?
sumber
Skrip bash kecil untuk melakukan kueri sederhana ke CSV dumps, terinspirasi oleh https://stackoverflow.com/a/5395421/2841607 .
sumber
Skrip bash berikut berfungsi untuk saya. Secara opsional juga mendapat skema untuk tabel yang diminta.
sumber
Saya mengalami masalah yang sama dan Jawaban Paulus bukan pilihan karena itu RDS. Mengganti tab dengan koma tidak berfungsi karena data telah menyematkan koma & tab. Saya menemukan bahwa mycli yang merupakan alternatif drop-in untuk klien mysql mendukung output csv dari kotak dengan
--csv
flagsumber
Jika Anda mendapatkan kesalahan ini saat Anda mencoba untuk mengekspor file Anda
dan Anda tidak dapat menyelesaikan kesalahan ini. Anda dapat melakukan satu hal hanya dengan menjalankan skrip python ini
sumber
Jika ada PHP yang diinstal pada mesin yang Anda gunakan, Anda dapat menulis skrip PHP untuk melakukannya. Diperlukan instalasi PHP agar ekstensi MySQL diinstal.
Anda dapat memanggil juru bahasa PHP dari baris perintah seperti:
Saya termasuk
--php-ini
saklar, karena Anda mungkin perlu menggunakan konfigurasi PHP Anda sendiri yang memungkinkan ekstensi MySQL. Pada PHP 5.3.0+ ekstensi itu diaktifkan secara default, sehingga tidak perlu lagi menggunakan konfigurasi untuk mengaktifkannya.Kemudian Anda dapat menulis skrip ekspor seperti skrip PHP biasa:
Keuntungan dari metode ini adalah, bahwa ia tidak memiliki masalah dengan bidang varchar dan teks, yang memiliki teks yang mengandung baris baru. Bidang-bidang tersebut dikutip dengan benar dan baris-baris baru di dalamnya akan ditafsirkan oleh pembaca CSV sebagai bagian dari teks, bukan catatan pemisah. Itu adalah sesuatu yang sulit untuk diperbaiki setelahnya dengan sed atau lebih.
sumber