Od czasu mojej ostatniej odpowiedzi Django wycofał się i usunął sygnał pre_syncdb
. Zaktualizowałem odpowiedź, aby uwzględnić nowsze wersje. Podstawowa mechanika jest identyczna dla nowszych wersji, ponieważ obie metody polegają na sygnałach i kodzie SQL, który wykonuje się tylko wtedy, gdy nie istnieje rozszerzenie HSTORE.
Django 1.8+
Ponieważ Django wprowadzono migracji DB pre_syncdb
sygnały marked deprecated in 1.7 i completely removed in 1.9. Jednak wprowadzili nowy sygnał o nazwie pre_migrate
, który może być używany w ten sam sposób.
"""
This is an example models.py which contains all model definition.
"""
from django.dispatch import receiver
from django.db import connection, models
from django.db.models.signals import pre_syncdb
import sys
# The sender kwarg is optional but will be called for every pre_syncdb signal
# if omitted. Specifying it ensures this callback to be called once.
@receiver(pre_migrate, sender=sys.modules[__name__])
def setup_postgres_hstore(sender, **kwargs):
"""
Always create PostgreSQL HSTORE extension if it doesn't already exist
on the database before syncing the database.
Requires PostgreSQL 9.1 or newer.
"""
cursor = connection.cursor()
cursor.execute("CREATE EXTENSION IF NOT EXISTS hstore")
# ...rest of your model definition goes here
class Foo(models.Model):
# ...field definitions, etc.
Django 1.6 + (oryginalna odpowiedź)
Moja sugestia jest użycie sygnału pre_syncdb
hak.
Zobacz moją odpowiedź na inne question.
"""
This is an example models.py which contains all model definition.
"""
from django.dispatch import receiver
from django.db import connection, models
from django.db.models.signals import pre_syncdb
import sys
# The sender kwarg is optional but will be called for every pre_syncdb signal
# if omitted. Specifying it ensures this callback to be called once.
@receiver(pre_syncdb, sender=sys.modules[__name__])
def setup_postgres_hstore(sender, **kwargs):
"""
Always create PostgreSQL HSTORE extension if it doesn't already exist
on the database before syncing the database.
Requires PostgreSQL 9.1 or newer.
"""
cursor = connection.cursor()
cursor.execute("CREATE EXTENSION IF NOT EXISTS hstore")
# ...rest of your model definition goes here
class Foo(models.Model):
# ...field definitions, etc.
Sygnał pre_syncdb
jest zwolniony przed utworzeniem tabeli modelu, dzięki czemu idealnie nadaje się do zapewnienia rozszerzenie jest zainstalowany, gdy baza danych test jest tworzone za każdym razem. IF NOT EXISTS
zapewnia, że PostgreSQL ignoruje polecenie, jeśli rozszerzenie jest już zainstalowane. Otrzymasz błąd, jeśli uruchomisz CREATE EXTENSION
na istniejącym już rozszerzeniu.
Działa to w domyślnym środowisku testowym jednostki Django i najprawdopodobniej będzie działać w przypadku testów nosa Django.
Więcej informacji na temat sygnałów: https://docs.djangoproject.com/en/1.6/ref/signals/#management-signals
Możesz zaoszczędzić sobie wiele bólu, tworząc rozszerzenie w bazie danych postgres 'template1'. Następnie dowolna baza danych utworzona po tym będzie miała rozszerzenie HSTORE. – rantanplan
rantaplan, które powinny być odpowiedzią! – 0atman
Jest OK, zwykle unikam udzielania odpowiedzi w jednym wierszu. Cieszę się, że pomogłem. – rantanplan