Как найти изменения в таблице относительно исходной фиксации SQL? - PullRequest
8 голосов
/ 17 сентября 2010

У меня есть ряд тестов, которые работают с базой данных MySQL, которая предварительно загружена схемами и примерами данных из набора файлов SQL. Некоторые из этих тестов во время выполнения также создают новые данные в базе данных.

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

Из-за сложного набора кода, который тестируется, невозможно выполнить одну транзакцию для всего теста, поэтому я не могу просто заставить MySQL откатить все назад (есть как несколько курсоров, так и несколько задействованы реплицированные серверы БД, среди прочих факторов).

Хотелось бы, чтобы у меня был способ более легко идентифицировать эти тесты, которые загрязняют БД, но поскольку допускает , то тесты могут записываться в БД (при условии, что они потом удаляются) Я не могу просто посмотреть на все изменения в БД - мне нужны только эффективные изменения, с отменой отмененных изменений.

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

Ответы [ 2 ]

1 голос
/ 18 сентября 2010

Перед тестом вы можете продублировать все таблицы (например, CREATE TABLE tmpTableA SELECT * FROM tableA) и затем присоединиться к ним после тестов, чтобы увидеть, какие новые строки там есть, с помощью оператора

SELECT a.*
FROM tableA a
LEFT JOIN tmpTableA as tmp on tmp.id=a.id
WHERE tmp.id IS NULL

Вы также можете сделать дамп таблицы перед тестами, затем после тестов, а затем выполнить diff для двух дампов.

1 голос
/ 17 сентября 2010

Несколько различных предложений, которые я получил по другим каналам:

  • CHECKSUM TABLE - это было бы почти идеально для моих нужд, за исключением того, чтоон работает только для таблиц MyISAM (мы используем InnoDB).

  • SHOW TABLE STATUS - это обеспечивает Data_length, что может работать как упрощенное сравнение.Если я не могу найти ничего лучше, этого может быть достаточно.

...