Интересно, какой самый быстрый способ выполнить такую задачу в PostgreSQL? Я заинтересован в самых быстрых решениях, когда-либо возможных.
Я нашел себе такое решение для MySQL, оно работает намного быстрее, чем просто усечение таблиц одна за другой. Но в любом случае меня интересуют и самые быстрые решения для MySQL. Смотрите мой результат здесь, конечно, это только для MySQL: https://github.com/bmabey/database_cleaner/issues/126
У меня есть следующие предположения:
- У меня 30-100 столов. Пусть им будет 30.
- Половина столов пуста.
- Каждая непустая таблица имеет, скажем, не более 100 строк. Я имею в виду, что таблицы НЕ большие.
-
Мне нужна дополнительная возможность исключить из этой процедуры 2, 5 или N таблиц.
-
Я не могу! использовать транзакции.
Мне нужна самая быстрая стратегия очистки для такого случая, работающая на PostgreSQL как 8, так и 9.
Я вижу следующие подходы:
-
Усекать каждую таблицу. Я думаю, это слишком медленно, особенно для пустых таблиц.
-
Проверьте каждую таблицу на пустоту более быстрым методом, а затем, если она пуста, сбросьте столбец уникального идентификатора (аналог AUTO_INCREMENT в MySQL) в исходное состояние (1), то есть восстановите ее last_value из последовательности обратно в 1, в противном случае запустите truncate в теме.
Я использую код Ruby для перебора всех таблиц, вызывая приведенный ниже код для каждой из них, я пытался настроить код SQL, работающий с каждой таблицей, например:
DO $$DECLARE r record;
BEGIN
somehow_captured = SELECT last_value from #{table}_id_seq
IF (somehow_captured == 1) THEN
== restore initial unique identifier column value here ==
END
IF (somehow_captured > 1) THEN
TRUNCATE TABLE #{table};
END IF;
END$$;
Управляя этим кодом в различных аспектах, я не мог заставить его работать, потому что я незнаком с функциями и блоками PostgreSQL (и переменными).
Также я предположил, что EXISTS (ВЫБРАТЬ что-то из TABLE) может как-то использоваться для хорошей работы в качестве одного из элементов "процедуры проверки", из которого должна состоять процедура очистки, но также не выполнила ее.
Я был бы признателен за любые советы о том, как эта процедура может быть выполнена в PostgreSQL нативным способом.
ОБНОВИТЬ:
Мне нужно все это для запуска модульных и интеграционных тестов для проектов Ruby или Ruby on Rails. Каждый тест должен иметь чистую БД перед выполнением или выполнять очистку после себя (так называемый демонтаж). Транзакции очень хороши, но они становятся непригодными для запуска тестов с конкретными веб-драйверами, в моем случае необходим переход на стратегию усечения. Как только я обновлю это со ссылкой на RoR, пожалуйста, не публикуйте здесь ответы о "Очевидно, вам нужен DatabaseCleaner для PG" и так далее, и так далее.
ОБНОВЛЕНИЕ 2:
Стратегия, описанная здесь недавно, была объединена с DatabaseCleaner, https://github.com/bmabey/database_cleaner как опция: pre_count (см. README там).