Я пытаюсь перенести свои юнит-тесты с H2 на Postgresql.
В настоящее время H2 предоставляет мне схему в памяти, так что каждое соединение сопоставляется с уникальной схемой, создает таблицы, запускает тест и удаляет схему. Создание и уничтожение схемы автоматически обрабатывается H2.
Модульные тесты запускаются одновременно.
Каков наилучший способ сделать это в Postgresql? В частности,
- Как получить уникальную схему для каждого соединения?
- Должна ли среда тестирования генерировать уникальные имена или есть встроенный механизм для этого?
- Как я могу гарантировать, что схема будет отброшена при разрыве соединения?
- Я не хочу заканчивать висящими схемами, когда модульные тесты убиты.
- Какой подход даст максимальную производительность?
- Мне нужно создавать / отбрасывать десятки схем в секунду.
ОБНОВЛЕНИЕ : я нашел связанный ответ здесь, но он не может отбросить схемы в случае, если процесс, выполняющий модульные тесты, будет убит.
источник
pg_temp
единственная схема правильна? Поэтому, когда я запускаю параллельные модульные тесты, не будут ли они забивать таблицы / данные друг друга?SET search_path
; используйтеSET LOCAL search_path
для установки на каждую субтранзакцию, или, если хотите, вы можете установить на уровне пользователя с помощьюALTER USER mytestuser SET search_path = 'pg_temp'
или на уровне базы данных с помощьюALTER DATABASE mytestdb SET search_path = 'pg_temp'
pg_temp
схемы?Вы можете получить имя текущей временной схемы (после создания первой временной таблицы), как показано в добавленной вами ссылке:
Но ваш текущий план все равно не будет иметь большого смысла. Чтобы создать таблицы в текущей временной схеме, просто создайте временные таблицы. Это все. По умолчанию
search_path
определяется так, что временные таблицы видны первыми. Один никогда не нужно схемы-квалифицироваться временными таблицы. Вы никогда не должны иметь для решения текущей временной схемы непосредственно в любом случае - что это деталь реализации.источник
If you're explicitly sequences ...
: Думаю, твой последний комментарий содержал опечатку. Что ты хотел сказать междуexplicitly
иsequences
?Ваши тесты включают транзакции? DDL является транзакционным в PostgreSQL, поэтому, если вы создаете свою схему и таблицы, а затем запускаете свои тесты, все в рамках одной транзакции, которая затем откатывается, схема фактически никогда не фиксируется и не видна другим сеансам.
Вам все равно нужно будет использовать, возможно, уникальное имя для вашей схемы (возможно, включить имя хоста и PID), так как
CREATE SCHEMA
это немедленно завершится ошибкой, если схема с одинаковым именем уже существует, и заблокируется, если другой сеанс создал схему с таким же именем в незафиксированная транзакция.Альтернативой может быть просто использование временных таблиц, если вы можете изменить сценарии создания базы данных для этого.
источник
CREATE SCHEMA
себя, единственная, которая может гарантировать, что они исчезнут, когда убит юнит-тест.Я только что получил идею.
Postgresql гарантирует, что сессия не может видеть чужие временные таблицы. Я предполагаю, что это означает, что когда вы создаете временную таблицу, она создает временную схему. Так что, возможно, я мог бы сделать следующее:
Мне не нравится полагаться на детали реализации, но в этом случае это кажется довольно безопасным.
источник