Правильный способ создания пользовательских типов pgsql в django

StackOverflow https://stackoverflow.com/questions/1056535

Вопрос

Каков правильный способ создания пользовательских типов 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top