MySQL / 10. Импорт и экспорт данных

Экспорт результатов запроса в XML

Задача
Вы хотите экспортировать результат запроса в XML-документ.

Решение
Используйте mysql или напишите собственную программу экспорта.

Обсуждение
Чтобы сформировать вывод результата запроса в формате XML, используйте mysql, если вы работаете с версией MySQL 4.0 или выше.

Можно написать собственную программу экспорта в XML. Для этого создайте запрос и выведите его, самостоятельно добавляя разметку XML. Или упростите себе жизнь, установив несколько модулей Perl и позволив им поработать:

• XML::Generator::DBI создает запрос по соединению DBI и передает результат соответствующей программе записи выходных данных.

• XML::Handler::YAWriter предоставляет такую программу записи выходных данных.

Следующий сценарий, mysql_to_xml.pl, напоминает mysql_to_text.pl, но не принимает опций для символов разделения и заключения в кавычки. Вы можете указать следующие опции:

--execute=запрос, -e запрос

Выполнить запрос запрос и экспортировать вывод.

--table=имя_таблицы, -t имя_таблицы

Экспортировать содержимое указанной таблицы. Эквивалентно использованию --execute для указания значения запрос для SELECT * FROM имя_таблицы.

При необходимости можно указать стандартные опции параметров соединения, такие как --user или --host. Последним аргументом командной строки должно быть имя базы данных, если только оно не указано неявно в запросе.

Предположим, что вы хотите экспортировать содержимое такой таблицы с данными экспериментов:

mysql> SELECT * FROM expt;
+---------+-----+-------+
| subject | test | score |
+---------+-----+-------+
| Jane    | A     | 47       |
| Jane    | B     | 50       |
| Jane    | C     | NULL   |
| Jane    |        | NULL   |
| Marvin | A     | 52       |
| Marvin | B     | 45       |
| Marvin | C     | 53      |
| Marvin | D     | NULL  |
+--------+-----+-------+

Вызовем mysql_to_xml.pl при помощи одной из команд:

% mysql_to_xml.pl --execute="SELECT * FROM expt" cookbook > expt.xml
% mysql_to_xml.pl --table=cookbook.expt > expt.xml

Получившийся документ XML expt.xml будет выглядеть так:

<?xml version="1.0" encoding="UTF-8"?>
<rowset>
<select query="SELECT * FROM expt">
<row>
<subject>Jane</subject>
<test>A</test>
<score>47</score>
</row>
<row>
<subject>Jane</subject>
<test>B</test>
<score>50</score>
</row>
<row>
<subject>Jane</subject>
<test>C</test>
</row>
<row>
<subject>Jane</subject>
<test>D</test>
</row>
<row>
<subject>Marvin</subject>
<test>A</test>
<score>52</score>
</row>
<row>
<subject>Marvin</subject>
<test>B</test>
<score>45</score>
</row>
<row>
<subject>Marvin</subject>
<test>C</test>
<score>53</score>
</row>
<row>
<subject>Marvin</subject>
<test>D</test>
</row>
</select>
</rowset>

Каждая строка записывается как элемент <row>. Внутри строки имена и значения столбцов используются в качестве имен и значений элементов, по одному элементу на столбец. Обратите внимание, что значения NULL в выводе не присутствуют.

Сценарий создает этот документ при помощи совсем небольшого фрагмента кода после обработки аргументов командной строки и установления соединения (код которых не приводится). Собственно с XML связаны части сценария mysql_to_xml.pl, содержащие предложения use, которые привлекают необходимые модули, а также создают и используют объекты XML. Когда заданы дескриптор базы данных $dbh и строка запроса $query, задача не так уж сложна. Код указывает объекту записи выходных данных на необходимость отправки результатов в стандартный вывод, устанавливает соединение объекта с DBI и запускает запрос:

#! /usr/bin/perl -w
# mysql_to_xml.pl - выгрузить указанную таблицу указанной базы данных
# в стандартный вывод в формате XML.
use strict;
use DBI;
use XML::Generator::DBI;
use XML::Handler::YAWriter;
# ... обработка опций командной строки (не приводится) ...
# ... соединение с базой данных (не приводится) ...
# создать программу записи вывода; "-" означает "стандартный вывод"
my $out = XML::Handler::YAWriter->new (AsFile => "-");
# установить соединение между DBI и программой записи вывода
my $gen = XML::Generator::DBI->new (
dbh => $dbh, # дескриптор базы данных
Handler => $out, # программа записи вывода
RootElement => "rowset" # корневые элементы документа
);
# запустить запрос и вывести XML
$gen->execute ($query);
$dbh->disconnect ();
exit (0);

Статьи по MySQL на эту тему:

Импорт XML в MySQL

Вернуться в раздел: MySQL / 10. Импорт и экспорт данных