#python #postgresql #sqlalchemy
#python #postgresql #sqlalchemy
Вопрос:
У меня есть скрипт, который очищает базу данных, и он широко используется в наших тестах.
Сначала мы попытались использовать SQLAlchemy Metadata.drop_all() , но это не разрешило некоторые внешние ключи при удалении, что вызвало ошибки. Затем я нашел этот скрипт от @zzzeek, который делает почти то же самое, но «умным» способом. Он обрабатывает все проблемы с внешними ключами, но теперь есть несколько проблем, связанных с измененными пользовательскими типами (перечислениями). Вопрос в том, как я могу удалить их все с помощью SQLAlchemy? Выполнить удаление ТИПА только вручную?
Таблицы в базе данных создаются с помощью Alembic, и даже несмотря на то, что приведенный выше сценарий успешно удаляет все таблицы, некоторые пользовательские перечисления все еще существуют, и все завершается неудачей при попытке их воссоздания.
Воссоздание всей базы данных не является предпочтительным решением, поскольку пользователь БД по умолчанию для приложения обычно не должен иметь прав на создание баз данных.
Ответ №1:
Вы уверены, что ваш экземпляр метаданных полностью описывает все таблицы?
Попробуйте:
Metadata.reflect()
Metadata.drop_all()
Ответ №2:
Это древний вопрос, но с этой проблемой все еще можно столкнуться, если create_type=False
она есть в каких-либо postgresql.ENUM
определениях.
Согласно документам SQLAlchemy на create_type
,
При значении False проверка не выполняется и не создается ТИП CREATE или DROP, если только ENUM.create() или ENUM.drop() не вызываются напрямую.
Это означает, что при выполнении тестов, хотя может быть настройка и удаление с create_all()
помощью и drop_all()
, ни один из них не повлияет на пользовательские типы перечислений.
Решение состоит в том, чтобы просто удалить create_type=False
, поскольку True
это значение по умолчанию. Тогда все пользовательские типы будут созданы в начале тестирования и удалены в конце, что приведет к идеально чистой тестовой базе данных.