Правильный способ создания пользовательских типов pgsql в Django - PullRequest
1 голос
/ 29 июня 2009

Как правильно создать пользовательские типы pgsql для приложения django, чтобы при каждом создании базы данных с помощью syncdb все пользовательские типы создавались до создания каких-либо таблиц (чтобы таблицы могли использовать этот тип)?

Я также использую django-evolution, но это не подходящее решение - оно запускается после syncdb. Я могу представить себе обходной путь, например, определение моделей со стандартными типами полей, а затем создание типов и изменение типов столбцов в эволюции, но это определенно нехорошо и неясно ...

Есть идеи?

1 Ответ

1 голос
/ 29 июня 2009

Я не верю, что в Джанго есть способ сделать это. Как вы, вероятно, знаете, есть сигнал post_syncdb, но нет сигнала для pre_syncdb.

Так что я думаю, что есть только два варианта: взломать pre_syncdb сигнал в Django или использовать такой инструмент автоматизации, как Fabric .

Взлом вашего собственного pre_syncdb сигнала, даже если это правильный способ сделать это, вероятно, будет непростым, и вам придется поддерживать патч каждый новый выпуск 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.

...