Як вивести результати запиту до MySQL у форматі CSV?

Чи існує простий спосіб запустити запит до MySQL з командного рядка Linux та вивести результати у форматі CSV ?

Ось що я зараз роблю:

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

Це стає безладним, коли є багато стовпців, які потрібно оточити лапками, або якщо в результатах є лапки, які потрібно уникнути.

Рішення

Від 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';

При використанні цієї команди назви стовпців не будуть експортовані.

Також зверніть увагу, що файл /var/lib/mysql-files/orders.csv буде знаходитися на сервері, на якому запущено MySQL. Користувач, під яким запущено процес MySQL, повинен мати права на запис в обраний каталог, інакше команда не буде виконана.

Якщо ви хочете записати висновок на вашу локальну машину з віддаленого сервера (особливо хостингу або віртуальної машини, такої як Heroku або Amazon RDS), це рішення не підходить.

Коментарі (31)

mysql --batch, -B

Вивести результати з використанням табуляції в якості роздільника стовпців; Вивести результати, використовуючи табуляцію як роздільник стовпців, з кожним рядком з нового рядка з нового рядка. При цьому параметрі mysql не використовує файл історії. Пакетний режим призводить до нетабличного формату виводу та екранування спеціальних символів. Екранування можна відключити, використовуючи необроблений режим; див. опис опції --raw.

Це дасть вам файл, розділений табуляцією. Оскільки коми (або рядки, що містять коми) не екрануються, змінити роздільник на кому не так просто.

Коментарі (9)

В якості альтернативи відповіді вище, ви можете мати таблицю MySQL, яка використовує механізм CSV.

Тоді у вас на жорсткому диску буде файл, який завжди буде у форматі CSV, який ви можете просто скопіювати, не обробляючи його.

Коментарі (2)