Конкретный случай использования:Сделать миграции Условное в Django
A Django module хочет создать расширение во время миграции. Если пользователь DB, который используется для запуска миграции, не является суперпользователем, этот не работает.
Существует несколько способов решения этой проблемы: один из способов (гипотетически) проверить файл миграции, независимо от того, установлено ли расширение и запускать только этот код SQL, если он не установлен.
После некоторых исследований, похоже, что Django RunSQL
может возвращать результаты и впоследствии исключать операции в зависимости от результата предыдущей операции. Будут ли другие способы достижения этого? (Например, подклассы RunSQL
?)
Любое решение, основанное на Django миграции, настройки Django или Postgres внутренний (один SQL заявление, что достигает запустить CREATE EXTENSION
только, если определенное условие истинно) будет в порядке.
(Обратите внимание, что я упомянул Джанго-pgcrypto-поля только для иллюстрации мне интересно знать, существует ли такое решение в целом.).
EDIT в ответ на комментарий Anentropic в: решение должно работать при запуске команд test
или jenkins
. Это означает, что вручную вызывается --fake-initial
или аналогично, чтобы избежать выполнения этой миграции, это не вариант. Если вы можете объяснить, как сделать test
подделкой определенных миграций, это наиболее приветствуется.
Мое текущее решение добавить следующее settings
:
MIGRATION_MODULES = {
'pgcrypto_fields': 'do-not-run-migrations'
}
Но это приведет к отключению всех миграций в вопросе и не только обижая один. В этом случае это может сработать, но я вижу это как удачную и уродливую работу.
Модуль нуждается в расширении, чтобы работать, поэтому вам нужно найти способ создания расширения. Я бы предложил создать расширение в качестве администратора, а затем [fake] (https://docs.djangoproject.com/en/1.8/ref/django-admin/# django-admin-option --- подделка). Соответствующая миграция – Anentropic
@ Энтропник Спасибо за предложение. К сожалению, это не будет работать с 'manage.py test', imho. Я отредактировал свой вопрос в ответ на ваш комментарий. – Risadinha
Если это для запуска тестов, я бы предложил использовать разные настройки db для тестов, вашему пользователю django db можно было бы получить доступ администратора к тесту db – Anentropic