Как экспортировать/выгрузить таблицу MySql в текстовый файл, включая имена полей (иначе заголовки или имена столбцов)

В интерпретаторе MySql очень легко вывести таблицу на экран вместе с именами ее полей.

Кажется, не существует простого способа экспортировать таблицу во внешний файл с разделителями табуляции или CSV, включая заголовки столбцов.

Я пытаюсь сделать это, используя только SQL или командную строку Linux, без написания программы на другом языке.

Спасибо


person Dan Goldstein    schedule 04.11.2008    source источник


Ответы (6)


Передача запроса клиенту командной строки выводит список, разделенный табуляцией, с именами столбцов в первой строке.

$ echo "select * from surveys limit 5" | mysql -uroot -pGandalf surveys
phone   param1  param2  param3  param4  p0      p1      p2      p3      audio4  code    time
XXXXXXXXX       2008-07-02      11:17:23        XXXXXXXX        SAT     -       -       -       -       -       ERROR   2008-07-02 12:18:32
XXXXXXXXX       2008-07-02      11:22:52        XXXXXXXX        SAT     -       -       -       -       -       COLGADO 2008-07-02 12:04:29
XXXXXXXXX       2008-07-02      11:41:29        XXXXXXXX        SAT     -       -       -       -       -       COLGADO 2008-07-02 12:07:22
XXXXXXXXX       2008-07-02      12:16:19        XXXXXXXX        SAT     1       1       1       9       XXXXXXXXX_4.wav     OK      2008-07-02 16:14:27
XXXXXXXXX       2008-07-02      08:21:25        XXXXXXXX        SAT     1       1       1       1       XXXXXXXXX_4.wav     OK      2008-07-02 12:29:40
person Vinko Vrsalovic    schedule 04.11.2008
comment
Это хак, а не функция, предоставляемая mysql. Я думаю, что это может не работать для других ОС. - person janetsmith; 03.08.2011
comment
Это не взлом, как таковой. Это, конечно, может не работать в системах, которые не предоставляют как нормального интерфейса командной строки, так и клиента командной строки mysql. - person Vinko Vrsalovic; 05.08.2011
comment
Будет ли это правильно цитировать (экранировать) имена столбцов и данные? - person LarsH; 17.04.2015
comment
Я использовал таким образом, спасибо @VinkoVrsalovic echo select user_pass from wp_users| mysql -uroot -proot wp_database › passwordList.txt - person aiffin; 22.01.2018

Этот небольшой скрипт должен сделать это:

-- 1. выберите таблицу и выходной файл здесь / это должен быть единственный вход

select 'mytable' into @tableName;
select 'c://temp/test.csv' into @outputFile;

-- 2. получить имена столбцов в формате, соответствующем запросу

select group_concat(concat("'",column_name, "'")) into @columnNames from information_schema.columns
where table_name=@tableName;

-- 3. построить запрос

SET @query = CONCAT(
"select * from
((SELECT ",@columnNames,")
UNION
(SELECT * FROM `",@tableName,"`)) as a
INTO OUTFILE '", @outputFile, "'");

-- 4. выполнить запрос

PREPARE stmt FROM @query;
EXECUTE stmt;
person cafe876    schedule 02.04.2012
comment
Будут ли столбцы, упорядоченные с помощью SELECT * ..., находиться в том же порядке, что и столбцы, перечисленные в запросе information_schema.columns? Не троллю тут - просто интересно... - person Chris Markle; 23.10.2012
comment
@cafe876: Спасибо за это решение. Мне просто интересно, зачем нужен апостроф `. Если я удалю оба апострофа, запрос не будет работать. Если я хочу добавить ограничение (например: SELECT 'x › 1' INTO @constr) в этой строке: (SELECT * FROM ",@tableName," WHERE ,@cosntr,)) как -› это не работает. Есть идеи? - person giordano; 12.09.2013
comment
@giordano: если вы хотите получить ответ, вам, вероятно, нужно лучше определить, что это не работает; например какое сообщение об ошибке вы видели? Вам также может понадобиться задать отдельный вопрос. Однако обратная галочка позволяет использовать имена столбцов, содержащие необычные символы. - person LarsH; 17.04.2015

Я достиг этого таким образом:

echo "select * from table"| mysql database -B -udbuser -puser_passwd | sed s/\\t/,/g > query_output.csv

Опция -B mysql разделяет столбцы табуляциями, которые преобразуются в запятые с помощью sed. Обратите внимание, что заголовки тоже генерируются.

person aizquier    schedule 22.06.2012
comment
Кстати, мне пришлось заменить \\t в OSX на Ctrl-V t. - person thekingoftruth; 01.05.2013
comment
@thekingoftruth Спасибо за это! В противном случае все буквы t в выводе заменяются запятыми. - person crlane; 27.06.2013
comment
Обратите внимание, что если какие-либо из ваших экспортируемых значений содержат запятые, они не будут должным образом экранированы или заключены в кавычки. - person LarsH; 17.04.2015

Это можно сделать с помощью команды mysqldump. Взгляните на параметры --tab и --xml.

person Dana the Sane    schedule 04.11.2008
comment
Я проверил это, и это не дало удовлетворительных результатов. А именно sudo mysqldump --user=root --pass=mypass -T /home/mydir mydb mytable дает mysqldump: Получил ошибку: 1: Невозможно создать/записать в файл '/home/mydir/mytable.txt' (Код ошибки: 13) при выполнении 'SELECT INTO OUTFILE' - person Dan Goldstein; 21.04.2009
comment
Вам не нужно использовать sudo для этого. Просто убедитесь, что вы запускаете mysqldump из учетной записи, у которой есть разрешение на запись в выходную папку, похоже, в этом и заключается ошибка. - person Dana the Sane; 21.04.2009
comment
Хорошо, заставил это работать, создав каталог с разрешениями 777. Однако он не выводил имена столбцов, а только данные. - person Dan Goldstein; 22.04.2009
comment
Убедитесь, что вы проверили верхнюю часть файла, обычно эти инструменты сначала выгружают схему, а затем данные. Если вам нужен файл с разделителями табуляции со столбцами в заголовке, возможно, вам придется использовать --xml и выполнить 2-й шаг преобразования. - person Dana the Sane; 22.04.2009

Я создал процедуру для автоматизации экспорта содержимого большего количества таблиц в файл .csv с помощью SELECT ... INTO OUTFILE. Пожалуйста, обратитесь к следующему, если вам нужно что-то вроде этого

http://lifeboysays.wordpress.com/2012/06/23/mysql-how-to-export-data-to-csv-with-column-headers/.

Он использует метод, описанный cafe876, но будет работать для одной или целой серии столов, плюс вы можете установить разделитель и символ кавычек, которые будут использоваться.

person Lifeboy    schedule 23.06.2012
comment
После этого не смог найти файл... ха-ха. - person thekingoftruth; 01.05.2013
comment
thekingoftruth: если вы посмотрите на скрипт, вы обнаружите, что по умолчанию для вывода используется /tmp. Файл будет там, но вы можете указать любое местоположение, например, так: CALL export_important_tables('',',','/home/steviewonder/'); И если вы проголосовали против из-за этого, пожалуйста, удалите отрицательный голос, хорошо? - person Lifeboy; 26.11.2018

Я использовал приведенную выше команду и изменил ее в соответствии с моими требованиями.
Мне нужно было получить столбец паролей из базы данных wordpress mysql в текстовом файле, для этого я использовал следующую команду ниже

echo "select user_pass from wp_users"| mysql -uroot -proot wp_database > passwordList.txt
person aiffin    schedule 22.01.2018