Результат запроса MySQL в XML

В прошлый раз я рассказывал как решить такую задачу в Oracle, теперь расскажу как можно результат запроса выгрузить в файл средствами MySQL.

И так, у нас есть MySQL и большой объем данных. Скажу сразу, что раньше эту задачу я решал средствами PHP и Apache, мой объем данных выгружался за 12 - 18 часов. Теперь, только средствами MySQL, на это уходит несколько секунд (я был поражен).

И так, начнем. Что бы выгрузить файл необходимо в запросе указать INTO OUTFILE 'имя_файла'

SELECT field_a, field_b
FROM foo
INTO OUTFILE '/tmp/from_mysql/result_example_1';

Сразу замечу, к каталогу /tmp/from_mysql необходим доступ для записи пользователя от имени которого запущен MySQL.

Теперь нужно сформировать данные в формате XML. Для этого мы используем функцию CONCAT() для объединения строк:

SELECT CONCAT(
"\n\t<a>", field_a, "</a>\n",
"\t<b>", field_b, "</b>\n")
FROM foo
INTO OUTFILE '/tmp/from_mysql/result_example_2';

Объединять поля можно и в CONCAT(), но лучше воспользоваться более правильными средствами MySQL:

SELECT CONCAT(
"\n\t<a>", field_a, "</a>\n",
"\t<b>", field_b, "</b>\n")
FROM foo
INTO OUTFILE '/tmp/from_mysql/result_example_3'
LINES
STARTING BY '\t\t<foo>'
TERMINATED BY "\t\t</foo>\n";

И еще пару строчек, что бы в наших данных не было лишних слешей экранирующих различные символы (например пробелы):

SELECT CONCAT(
"\n\t<a>", field_a, "</a>\n",
"\t<b>", field_b, "</b>\n")
FROM foo
INTO OUTFILE '/tmp/from_mysql/result_example_4'
FIELDS
TERMINATED BY ','
OPTIONALLY ENCLOSED BY ' '
ESCAPED BY ''
LINES
STARTING BY '\t\t<foo>'
TERMINATED BY "\t\t</foo>\n";

Вот собственно и все.

Автор: Сергей Степанов

Поделиться @
Иван, 2 июня 2016 в 22:21
В man mysql в таблице есть параметр конфигурационного файла xml и параметры командной строки --xml и -X, предназначенные для генерации вывода в формате XML. Это не подходит? Если что, там ещё есть html, --html, -H и -B для генерации в формате HTML.