Есть ли простой способ выполнить запрос 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
Это становится грязным, когда есть много столбцов, которые должны быть заключены в кавычки, или если в результатах есть кавычки, которые нужно экранировать.
REPLACE()
в своем запросе экранирование кавычек.Ответы:
С http://www.tech-recipes.com/rx/1475/save-mysql-query-results-into-a-text-or-csv-file/
С помощью этой команды имена столбцов не будут экспортированы.
Также обратите внимание, что
/var/lib/mysql-files/orders.csv
будет на сервере под управлением MySQL. Пользователь, под которым запущен процесс MySQL, должен иметь права на запись в выбранный каталог, иначе команда не будет выполнена.Если вы хотите записать вывод на локальный компьютер с удаленного сервера (особенно с размещенной или виртуализированной машины, такой как Heroku или Amazon RDS), это решение не подходит.
источник
Который разделен табуляцией. Передайте это так, чтобы получить настоящий CSV (спасибо @therefromhere):
источник
| sed 's/\t/,/g'
Это даст вам файл, разделенный табуляцией. Поскольку запятые (или строки, содержащие запятую) не экранированы, заменить разделитель на запятую непросто.
источник
Вот довольно грубый способ сделать это. Нашел где-то, не могу взять кредит
mysql --user=wibble --password wobble -B -e "select * from vehicle_categories;" | sed "s/'/\'/;s/\t/\",\"/g;s/^/\"/;s/$/\"/;s/\n//g" > vehicle_categories.csv
Работает довольно хорошо. Еще раз, хотя регулярное выражение доказывает только запись.
Regex Объяснение:
Итак, складывая все вместе:
источник
mysql -B
. Если вы разделите регулярное выражение на отдельные операторы в отдельных строках, это будет довольно просто (для тех, кто знает регулярное выражение) понять.","
и ряд других вещей.Только для Unix / Cygwin , передайте через 'tr':
Примечание: это не обрабатывает ни встроенные запятые, ни вкладки.
источник
Это спасло меня пару раз. Быстро и все работает!
Пример:
Для полноты вы можете преобразовать в CSV (но будьте осторожны, потому что вкладки могут быть внутри значений полей - например, текстовые поля)
источник
OUTFILE решение , данное Полем Tomblin вызывает файл , который будет записан на самой MySQL сервера, так что это будет работать только если у вас есть ФАЙЛА доступ, а также доступ входа в систему или другие средства для извлечения файла из этого окна.
Если у вас нет такого доступа, и вывод с разделителями табуляцией является разумной заменой CSV (например, если ваша конечная цель - импортировать в Excel), то решение Serbaut (с использованием
mysql --batch
и по желанию--raw
) - это путь.источник
MySQL Workbench может экспортировать наборы записей в CSV, и кажется, что он хорошо обрабатывает запятые в полях. CSV открывается в OpenOffice нормально.
источник
Как насчет:
источник
mysql -uUser -pPassword your_database < my_requests.sql | awk 'BEGIN{OFS="=";} {print $1,$2}' > out.csv
Все решения, представленные здесь на сегодняшний день, кроме решения MySQL, являются некорректными и, возможно, небезопасными (то есть проблемами безопасности) по крайней мере для некоторого возможного содержимого в базе данных mysql.
MYSQL Workbench (и аналогично PHPMyAdmin) предоставляют формально правильное решение, но предназначены для загрузки вывода в местоположение пользователя. Они не так полезны для таких вещей, как автоматизация экспорта данных.
Невозможно сгенерировать надежно правильный CSV из вывода
mysql -B -e 'SELECT ...'
потому что это не может закодировать возврат каретки и пробел в полях. Флаг '-s' для mysql действительно экранирует обратную косую черту и может привести к правильному решению. Тем не менее, использование языка сценариев (язык с достойной внутренней структурой данных, а не bash) и библиотек, где проблемы кодирования уже были тщательно проработаны, гораздо безопаснее.Я подумал о написании сценария для этого, но как только я подумал о том, что я бы назвал, мне пришло в голову искать уже существующую работу с тем же именем. Несмотря на то, что я не прошел через это подробно, решение на https://github.com/robmiller/mysql2csv выглядит многообещающим. В зависимости от вашего приложения, подход yaml к указанию команд SQL может или не может понравиться. Я также не в восторге от требования более свежей версии ruby, чем стандартная комплектация для моего ноутбука Ubuntu 12.04 или серверов Debian Squeeze. Да, я знаю, что мог бы использовать RVM, но я бы предпочел не поддерживать это для такой простой цели.
Надеюсь, кто-то укажет подходящий инструмент, который прошел небольшое тестирование. В противном случае я, вероятно, обновлю это, когда найду или напишу.
источник
Многие из ответов на этой странице являются слабыми, потому что они не обрабатывают общий случай того, что может происходить в формате CSV. например, запятые и кавычки, встроенные в поля и другие условия, которые всегда появляются в конце концов. Нам нужно общее решение, которое работает для всех допустимых входных данных CSV.
Вот простое и сильное решение в Python:
Назовите этот файл
tab2csv
, укажите его путь, дайте ему разрешение на выполнение, затем используйте его так:Функции обработки CSV в Python охватывают угловые случаи для входного формата CSV.
Это может быть улучшено для обработки очень больших файлов с помощью потокового подхода.
источник
Из вашей командной строки вы можете сделать это:
Кредиты: экспорт таблицы из Amazon RDS в файл CSV
источник
CREATE TABLE () (SELECT data FROM other_table ) ENGINE=CSV ;
источник
В этом ответе используется Python и популярная сторонняя библиотека PyMySQL . Я добавляю его, потому что библиотека csv в Python достаточно мощная, чтобы правильно обрабатывать различные варианты,
.csv
и никакие другие ответы не используют код Python для взаимодействия с базой данных.источник
Это просто и работает с чем угодно, не требуя пакетного режима или выходных файлов:
Объяснение:
"
с""
в каждой области ->replace(field1, '"', '""')
concat('"', result1, '"')
concat_ws(',', quoted1, quoted2, ...)
Это оно!
источник
NULL
значения будут пропущеныconcat_ws()
, что приведет к несоответствию столбца. Чтобы избежать этого, просто используйте вместо этого пустую строку:IFNULL(field, '')
(или все, что вы используете для представленияNULL
)В качестве альтернативы ответу выше, у вас может быть таблица MySQL, использующая механизм CSV.
Тогда у вас будет файл на жестком диске, который всегда будет в формате CSV, который вы можете просто скопировать без обработки.
источник
Чтобы развернуть предыдущие ответы, следующий однострочный файл экспортирует одну таблицу в виде файла, разделенного табуляцией. Это подходит для автоматизации, экспорт базы данных каждый день или около того.
Удобно, что мы можем использовать ту же технику для вывода списка таблиц MySQL и описания полей в одной таблице:
источник
mysql -B -D mydatabase -e 'select * from mytable' | sed -e 's/\t/,/g'
sed -e 's/\t/,/g'
безопасно только в том случае, если вы уверены, что ваши данные не содержат запятых или вкладок.Опираясь на user7610, вот лучший способ сделать это. С
mysql outfile
60 минутами были проблемы с владением файлами и перезаписью.Это не круто, но это сработало за 5 минут.
php csvdump.php localhost root password database tablename > whatever-you-like.csv
источник
Кроме того, если вы выполняете запрос в командной строке Bash, я считаю, что эту
tr
команду можно использовать для замены вкладок по умолчанию на произвольные разделители.$ echo "SELECT * FROM Table123" | mysql Database456 | tr "\t" ,
источник
Вот что я делаю:
Скрипт perl (снятый откуда-то) отлично работает для преобразования полей с табуляцией в CSV.
источник
perl -F"\t" -lane 'print join ",", map {s/"/""/g; /^\d+(?:\.\d+)?$/ ? $_ : qq("$_")} @F '
- ваши не будут цитировать1.2.3
Не совсем как формат CSV, но
tee
команда из MySQL клиента может использоваться для сохранения вывода в локальный файл:Вы можете отключить его, используя
notee
.Проблема в
SELECT … INTO OUTFILE …;
том, что для этого требуется разрешение на запись файлов на сервер.источник
Используя решение, опубликованное Тимом, я создал этот сценарий bash для упрощения процесса (запрашивается пароль root, но вы можете легко изменить сценарий для запроса любого другого пользователя):
Это создаст файл с именем: database.table.csv
источник
Если у вас настроен PHP на сервере, вы можете использовать mysql2csv для экспорта (действительно допустимого) файла CSV для произвольного запроса mysql. Смотрите мой ответ на MySQL - SELECT * INTO OUTFILE LOCAL?немного больше контекста / информации.
Я пытался сохранить имена опций с
mysql
поэтому она должна быть достаточной , чтобы обеспечить--file
и--query
возможность:«Установить»
mysql2csv
через(загрузить содержимое гистограммы, проверить контрольную сумму и сделать ее исполняемой).
источник
Что сработало для меня:
Ни одно из решений в этом потоке не работало для моего конкретного случая, у меня были красивые данные json внутри одного из столбцов, которые могли быть испорчены в моем выводе csv. Для тех, у кого похожая проблема, попробуйте строки, оканчивающиеся на \ r \ n.
Еще одна проблема для тех, кто пытается открыть csv с помощью Microsoft Excel, имейте в виду, что существует ограничение в 32 767 символов, которое может содержать одна ячейка, при этом она переполняется до строк ниже. Чтобы определить, какие записи в столбце имеют проблему, используйте запрос ниже. Затем вы можете обрезать эти записи или обработать их, как хотите.
источник
Если вы получаете сообщение об ошибке,
secure-file-priv
то также после смещения места назначения файла внутри,C:\ProgramData\MySQL\MySQL Server 8.0\Uploads
а также после этого запросаSELECT * FROM attendance INTO OUTFILE 'C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\FileName.csv' FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';
не работает, вы должны просто изменить
\
(backsplash) с запроса на/
(forwardsplash)И это работает !!
Пример:
Каждый раз, когда вы запускаете успешный запрос, он каждый раз генерирует новый CSV-файл! Круто, верно?
источник
Крошечный bash-скрипт для выполнения простого запроса к дампам CSV, вдохновленный https://stackoverflow.com/a/5395421/2841607 .
источник
Следующий скрипт bash работает для меня. Опционально также получает схему для запрошенных таблиц.
источник
Я столкнулся с той же самой проблемой, и Ответ Пола не был выбором, так как это было RDS. Замена вкладки запятыми не работала, поскольку в данные были встроены запятые и вкладки. Я обнаружил, что mycli, который является альтернативой для mysql-клиента, поддерживает вывод csv из коробки с
--csv
флагомисточник
Если вы получаете эту ошибку при попытке экспортировать файл
и вы не можете решить эту ошибку. Вы можете сделать одну вещь, просто запустив этот скрипт Python
источник
Если на используемой вами машине установлен PHP, вы можете написать PHP-скрипт для этого. Это требует установки PHP с установленным расширением MySQL.
Вы можете вызвать интерпретатор PHP из командной строки следующим образом:
Я включаю
--php-ini
коммутатор, потому что вам может понадобиться использовать собственную конфигурацию PHP, которая включает расширение MySQL. В PHP 5.3.0+ это расширение включено по умолчанию, поэтому больше нет необходимости использовать конфигурацию для его включения.Затем вы можете написать свой скрипт экспорта как любой обычный скрипт PHP:
Преимущество этого метода в том, что у него нет проблем с полями varchar и text, в которых есть текст, содержащий символы новой строки. Эти поля правильно заключены в кавычки, и эти новые строки в них будут интерпретироваться читателем CSV как часть текста, а не разделители записей. Это то, что потом трудно исправить с помощью sed или около того.
источник