Я не знаю psycopg2 и PostgreSQL, но только apsw и SQLite, поэтому я думаю, что не могу помочь "psycopg2".
Но мне кажется, что PostgreSQL может работать аналогично SQLite, у него есть два режима работы:
- За пределами блока транзакции. Это семантически эквивалентно наличию блока транзакции вокруг каждой отдельной операции SQL
- Внутри блока транзакции, помеченного как «НАЧАЛО СДЕЛКИ» и заканчивающегося «КОНЕЦ СДЕЛКИ»
В этом случае проблема может быть внутри уровня доступа psycopg2. Когда он обычно работает так, что транзакции имплицитно вставляются до тех пор, пока не будет сделан коммит, не может быть «стандартного способа» создания вакуума.
Конечно, возможно, что «psycopg2» имеет свой особый «вакуумный» метод или специальный режим работы, где не запускаются неявные транзакции.
Если таких возможностей не существует, остается один единственный вариант (без изменения уровня доступа ;-)):
Большинство баз данных имеют программу оболочки для доступа к базе данных. Программа может запустить эту программу оболочки с конвейером (введя команду вакуума в оболочку), таким образом используя программу оболочки для создания вакуума. Поскольку вакуум является медленной операцией как таковой, запуск внешней программы будет игнорироваться. Конечно, реальная программа должна фиксировать всю незавершенную работу раньше, иначе может возникнуть ситуация тупиковой блокировки - вакуум должен ждать до конца вашей последней транзакции.