Есть ли простой способ выполнить запрос 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), это решение не подходит.
mysql --batch, -B
Выведите результаты, используя табуляцию в качестве разделителя столбцов, с каждой строкой на новой строке. При использовании этой опции mysql не использует файл истории. Пакетный режим приводит к нетабличному формату вывода и экранированию > специальных символов. специальных символов. Экранирование можно отключить, используя режим raw; см. описание опции --raw.
В результате вы получите файл, разделенный табуляцией. Поскольку запятые (или строки, содержащие запятые) не экранируются, изменить разделитель на запятую не так просто.
Здесь'ы довольно грубый способ сделать это. Нашли его где-то, может'т принять любой кредитной
в <код>в MySQL и пользователя --=--пароль wibble колебание -б-е "и выберите * от vehicle_categories; и" | ООО "и с/'/\'/;с/\т/\то",\" В/Г;с/^/\" и/;с/$/\" и/;с/\н//Г" и > vehicle_categories.КШМ</код>
Работает довольно хорошо. В очередной раз, хотя регулярное выражение доказывает только пишу.
Регулярное Объяснение:
Итак, собираем все вместе:
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
В Unix/под Cygwin только, по 'тр':
mysql <database> -e "<query here>" | tr '\t' ',' > data.csv
Б. Н.: эти ручки ни внедренные запятые, ни встроенных вкладок.
Это спасло меня пару раз. Быстро и все работает!
Пример:
mysql -udemo_user -p -h127.0.0.1 --port=3306 \
--default-character-set=utf8mb4 --database=demo_database \
--batch --raw < /tmp/demo_sql_query.sql > /tmp/demo_csv_export.tsv
Для полноты картины можно было бы преобразовать в CSV (а будьте осторожны потому что вкладок может быть внутри области значений - например, текстовые поля)
тр '\т' ',' файл<.ТСВ > файл.КШМ
Выходной файл решение дано Павлом Томблин вызывает файл, который будет записан на сервер MySQL, так что это будет работать только если у вас есть файл доступа, а также доступа или другими средствами для извлечения файлов из этой коробки.
Если вы Don'т иметь такого доступа, и табуляцией выход является разумной заменой, для CSV (например, если конечная цель-импорт в Excel), то Serbaut'ный раствор (с использованием СУБД MySQL --партияи опционально
--сырье`) является способом пойти.
Верстак для MySQL возможность экспорта записей в CSV, и, похоже, ручка запятые в полях очень хорошо. Файл CSV открывается в OpenOffice нормально.
Все решения здесь на сегодняшний день, кроме MySQL в верстак в одну, являются неправильными и, возможно, небезопасно (вопросы безопасности IE) для хоть какого возможного содержания в БД MySQL.
Верстак MySQL (и точно так же через phpmyadmin) дает формально правильное решение, но предназначены для загрузки выходные данные пользователей'ы местонахождение. Они'повторно не так полезно для вещей как автоматизировать экспорт данных.
Это не возможно, чтобы создать надежную правильный CSV-файл с выхода `в MySQL -б-д 'выберите ...' потому что не может кодировать символы возврата каретки и пробелы в полях. В '-с' флаг в MySQL делает обратную косую черту побега, и может привести к правильному решению. Однако, используя язык сценариев (один с приличными внутренними структурами данных, а не Баш), и библиотеки, где вопросы кодировки уже были тщательно проработаны намного безопаснее.
Я думал о написании сценария для этого, но как только я подумал о том, что я'д назвать, мне пришло в голову искать работу, уже проделанную с таким же названием. Пока я не'т его тщательно, решение на https://github.com/robmiller/mysql2csv выглядит многообещающе. В зависимости от вашего приложения, подход YAML, чтобы указать SQL-команды могут и не обратиться. Я'м тоже не в восторге с требованием на более свежую версию Ruby, чем поставляется в стандартной комплектации с моей Убунту 12.04 ноутбук или сжать серверов Debian. Да я знаю, я мог бы использовать РВМ, но я'д, а не поддерживать, что для такой простой цели.
Надеюсь, кто-то выделит для себя подходящий инструмент, что's было немного тестирования. В противном случае я'будете, вероятно, обновлять это, когда я найду или напишу.
Из командной строки вы можете сделать это:
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*
Кредиты: https://stackoverflow.com/questions/9536224/exporting-table-from-amazon-rds-into-a-csv-file
Многие ответы на этой странице являются слабыми, потому что они Дон'Т-образная рукоятка, в общем случае, что может произойти в формат CSV. например, запятые и кавычки, встроенные в поля и других условий, которые всегда приходят в конце концов. Нам нужно общее решение, которое работает для всех допустимых входных данных CSV.
Здесь'ы простое и сильное решение в Python:
#!/usr/bin/env python
import csv
import sys
tab_in = csv.reader(sys.stdin, dialect=csv.excel_tab)
comma_out = csv.writer(sys.stdout, dialect=csv.excel)
for row in tab_in:
comma_out.writerow(row)
Tab2csv имя, файл, ставите его на свой путь, дать ему права на выполнение, а затем использовать его как это:
mysql OTHER_OPTIONS --batch --execute='select * from whatever;' | tab2csv > outfile.csv
Питон КШМ функции обработки крышки случаях для входных CSV формат(ы).
Это может быть улучшена, чтобы обрабатывать очень большие файлы через потоковый подход.
Создать таблицу () (выбрать данные из other_table ) двигатель=КШМ ;
при создании таблицы CSV, сервер создает файл в формате таблицы каталог базы данных. Файл начинается с имени таблицы и имеет .расширением FRM. Механизм хранения также создает файл данных. Свое название начинается с имени таблицы и имеет .Расширением CSV. Файл данных В обычном текстовом файле. Когда вы храните данные в таблицу, хранения двигатель сохраняет его в файл данные в CSV формат.
Этот ответ использует Python и популярных сторонних библиотек, PyMySQL. Я'м добавлять его, так как Python'ы [КШМ] библиотека(https://docs.python.org/3/library/csv.html) достаточно мощный, чтобы правильно обрабатывать различные ароматы `.КШМ и никакие другие ответы, используя Python код для взаимодействия с базой данных.
import contextlib
import csv
import datetime
import os
# https://github.com/PyMySQL/PyMySQL
import pymysql
SQL_QUERY = """
SELECT * FROM my_table WHERE my_attribute = 'my_attribute';
"""
# embedding passwords in code gets nasty when you use version control
# the environment is not much better, but this is an example
# https://stackoverflow.com/questions/12461484
SQL_USER = os.environ['SQL_USER']
SQL_PASS = os.environ['SQL_PASS']
connection = pymysql.connect(host='localhost',
user=SQL_USER,
password=SQL_PASS,
db='dbname')
with contextlib.closing(connection):
with connection.cursor() as cursor:
cursor.execute(SQL_QUERY)
# Hope you have enough memory :)
results = cursor.fetchall()
output_file = 'my_query-{}.csv'.format(datetime.datetime.today().strftime('%Y-%m-%d'))
with open(output_file, 'w', newline='') as csvfile:
# http://stackoverflow.com/a/17725590/2958070 about lineterminator
csv_writer = csv.writer(csvfile, lineterminator='\n')
csv_writer.writerows(results)
Это простой, и он работает на чем угодно, не нуждаясь в пакетном режиме или выходные файлы:
select concat_ws(',',
concat('"', replace(field1, '"', '""'), '"'),
concat('"', replace(field2, '"', '""'), '"'),
concat('"', replace(field3, '"', '""'), '"'))
from your_table where etc;
Объяснение:
"
с " и"
в каждом поле --> заменить(поле1, ' С"', '&и" Наша"')
функция concat(' и"', результат1, '" у')
concat_ws(',', год quoted1, quoted2, ...)
Что's это!
В качестве альтернативы ответу выше, вы можете иметь таблицу MySQL, которая использует механизм CSV.
Тогда у вас будет файл на жестком диске, который всегда будет в формате CSV, который вы можете просто скопировать, не обрабатывая его.
Чтобы развернуть на предыдущие ответы, следующие один-лайнер экспорт одной таблицы в виде файла с разделителями табуляции. Это's подходит для автоматизации, экспорт базы каждый день или так.
mysql -B -D mydatabase -e 'select * from mytable'
Удобно, мы можем использовать тот же метод, чтобы вывести список с MySQL'таблиц Ы, и для описания поля в одной таблице:
mysql -B -D mydatabase -e 'show tables'
mysql -B -D mydatabase -e 'desc users'
Field Type Null Key Default Extra
id int(11) NO PRI NULL auto_increment
email varchar(128) NO UNI NULL
lastName varchar(100) YES NULL
title varchar(128) YES UNI NULL
userName varchar(128) YES UNI NULL
firstName varchar(100) YES NULL
Также, если вы'повторного выполнения запроса на bash-команда, я верю в команду тр
может использоваться, чтобы заменить вкладки по умолчанию для произвольных разделителей.
Эхо "$; Выберите * от Table123" и я Database456 | MySQL в | тр &;\т" у ,
Дом на user7610, вот лучший способ, чтобы сделать это. С MySQL в файл outfile` было 60 минут владельца файла и перезаписи проблем.
Это's не круто, но он работал в 5 минут.
в PHP csvdump.php локальный пароль root имя_таблицы базы данных и GT; что-вам-нравится.КШМ
<?php
$server = $argv[1];
$user = $argv[2];
$password = $argv[3];
$db = $argv[4];
$table = $argv[5];
mysql_connect($server, $user, $password) or die(mysql_error());
mysql_select_db($db) or die(mysql_error());
// fetch the data
$rows = mysql_query('SELECT * FROM ' . $table);
$rows || die(mysql_error());
// create a file pointer connected to the output stream
$output = fopen('php://output', 'w');
// output the column headings
$fields = [];
for($i = 0; $i < mysql_num_fields($rows); $i++) {
$field_info = mysql_fetch_field($rows, $i);
$fields[] = $field_info->name;
}
fputcsv($output, $fields);
// loop over the rows, outputting them
while ($row = mysql_fetch_assoc($rows)) fputcsv($output, $row);
?>
Не совсем в формате CSV, но командатройник
от MySQL клиент может быть использован, чтобы сохранить вывод в местное файл:
tee foobar.txt
SELECT foo FROM bar;
Вы можете отключить его с помощью notee
.
Проблема выбора ... в outfile ...; заключается в том, что он требует права на запись файлов на сервере.