MySQL: дамп базы данных из запроса SQL - PullRequest
1 голос
/ 08 января 2010

Я пишу тестовый фреймворк, в котором мне нужно захватить состояние базы данных MySQL (структура таблицы, содержимое и т. Д.).

Это необходимо для проверки того, что состояние не изменилось после определенных операций. (Значения автоинкремента могут изменяться , но я думаю, что смогу справиться с этим.)

Дамп предпочтительно должен быть в удобочитаемом формате (предпочтительно в коде SQL, как это делает mysqldump).

Я хочу ограничить мою тестовую среду только использованием соединения MySQL. Чтобы захватить состояние, он должен , а не вызывать mysqldump или обращаться к файловой системе (например, копировать файлы * .frm или делать SELECT INTO файл, хотя каналы в порядке).

Поскольку это будет только тестовый код, меня не волнует производительность. Хотя мне нужно надежное поведение.

Каков наилучший способ реализовать нужные мне функции?

Полагаю, я должен основывать свой код на некоторых из существующих инструментов резервного копирования с открытым исходным кодом ... Какой из них лучше всего посмотреть?

Обновление: Я не указываю язык, на котором пишу это (нет, это не PHP), так как я не думаю, что смогу повторно использовать код как есть & mdash; Мой случай довольно особенный (для практических целей, допустим, MySQL C API). Код будет работать в Linux.

Ответы [ 3 ]

2 голосов
/ 09 января 2010

Учитывая ваши требования, я думаю, что вы остались с (псевдокод + SQL)

tables = mysql_fetch "SHOW TABLES"
foreach table in tables
    create = mysql_fetch "SHOW CREATE TABLE table"
    print create
    rows = mysql_fetch "SELECT * FROM table"
    foreach row in rows
        // or could use VALUES (v1, v2, ...), (v1, v2, ...), .... syntax (maybe preferable for smaller tables)
        insert = "INSERT (fiedl1, field2, field2, etc) VALUES (value1, value2, value3, etc)"
        print insert

По сути, получить список всех таблиц, затем пройтись по каждой таблице и сгенерировать операторы INSERT для каждой строки вручную (большинство apis имеют простой способ получить список имен столбцов, в противном случае вы можете вернуться к вызову DESC TABLE).

SHOW CREATE TABLE сделано для вас, но я вполне уверен, что нет ничего аналогичного, чтобы сделать SHOW INSERT ROWS.

И, конечно, вместо печати дампа вы можете делать с ним все, что захотите.

1 голос
/ 08 января 2010

Если вы не хотите использовать инструменты командной строки, другими словами, вы хотите сделать это полностью, скажем, на php или на любом другом языке, который вы используете, тогда почему бы вам не выполнить итерацию по таблицам, используя сам SQL. например, чтобы проверить структуру таблицы, одним простым методом было бы получить снимок структуры таблицы с помощью SHOW CREATE TABLE table_name, сохранить результат, а затем снова выполнить вызов и сравнить результаты.

Вы смотрели исходный код mysqldump? Я уверен, что большая часть того, что вы хотите, будет заключена в этом.

DC

0 голосов
/ 08 января 2010

Если вы не строите экспорт самостоятельно, я не думаю, что есть простое решение для экспорта и проверки данных. Если вы делаете это в таблице для каждой таблицы, LOAD DATA INFILE и SELECT ... INTO OUTFILE могут быть полезны.

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

Другая альтернатива, которую я использую в некоторых проектах, где дизайн не допускает такого хорошего разделения, хорошо работает с использованием InnoDB или некоторого другого механизма транзакционных баз данных. Пока вы отслеживаете свои транзакции или отключаете их во время теста, вы можете просто запустить транзакцию в setUp () и откатить в tearDown ().

...