Правильный способ создания пользовательских типов pgsql в django
-
20-08-2019 - |
Вопрос
Каков правильный способ создания пользовательских типов pgsql для приложения django, чтобы при каждом создании базы данных с помощью syncdb все пользовательские типы создавались до создания каких-либо таблиц (чтобы таблицы могли использовать этот тип)?
Я также использую django-evolution, но это неподходящее решение — оно запускается после syncdb.Я могу представить себе обходной путь, например, определение моделей со стандартными типами полей, а затем создание типов и изменение типов столбцов в evolutions, но это определенно нехорошо и как-то непонятно...
Есть какие-нибудь идеи?
Решение
Я не верю, что есть способ сделать это в Django.Как вы, вероятно, знаете, существует post_syncdb
сигнал, но нет сигнала для pre_syncdb
.
Поэтому я думаю, что есть только два варианта:взлом pre_syncdb
подайте сигнал в Django или используйте инструмент автоматизации, такой как Ткань.
Взламывать свой собственный pre_syncdb
signal, даже если это правильный способ сделать это, вероятно, будет непростым, и вам придется поддерживать исправление в каждом новом выпуске Django.
С другой стороны, такой инструмент автоматизации, как Fabric, не только прост, но и предоставляет вашему проекту другие преимущества.
В качестве примера, часть моего Fabfile выглядит следующим образом:
def createdb():
"Create a clean database"
run('createdb --encoding=UNICODE $(db_name) -O $(db_owner) -U $(db_owner)')
run('python manage.py syncdb --noinput')
Добавьте что-то вроде этого непосредственно перед syncdb:
run('psql -U $(db_owner) $(db_name) < app/sql/custom_types.sql')
и вы должны быть хороши, чтобы просто набрать:
$ fab createdb
или:
$ fab cluster createdb
чтобы запустить команду на всех компьютерах, перечисленных в вашей среде, вызывается cluster
.