Instalación de la extensión hstore en las pruebas de la nariz de django

He instalado la extensión hstore con éxito, y todo funciona cuando syncdb . (Estoy usando djorm-ext-hstore )

Sin embargo, nose crea una nueva base de datos temporal para ejecutar pruebas y hstore no está instalado en ella.

Necesito ejecutar CREATE EXTENSION HSTORE; en la prueba db justo antes de que la nariz sincronice la db, pero no puedo encontrar ninguna información sobre cómo hacerlo.

¿Algunas ideas?

Esto no es un problema: la mejor manera de solucionarlo es aplicar la extensión hstore en la base de datos predeterminada, template1

psql -d template1 -c 'create extension hstore;'

Referencia: ¿Cómo crear una nueva base de datos con la extensión hstore ya instalada?

Con Django 1.8:

 from django.contrib.postgres.operations import HStoreExtension class Migration(migrations.Migration): ... operations = [ HStoreExtension(), ... ] 

https://docs.djangoproject.com/en/1.8/ref/contrib/postgres/fields/#hstorefield

EDITAR: Solo tenga en cuenta que también hay un JSONField que maneja (no) la ordenación de json y la búsqueda en línea. La HStoreExtension no es necesaria para ello. Requiere Django> = 1.11 y Postgres> = 9.4.

También puede ejecutar el comando sql en una migración (Django 1.8):

 class Migration(migrations.Migration): # ... operations = [ migrations.RunSQL('create extension hstore;'), # ... 

Supongo que estás usando django-nose . En este caso, debe crear su propio TestSuiteRunner :

 from django.db import connections, DEFAULT_DB_ALIAS from django_nose import NoseTestSuiteRunner class MyTestSuiteRunner(NoseTestSuiteRunner): def setup_databases(self): result = super(MyTestSuiteRunner, self).setup_databases() connection = connections[DEFAULT_DB_ALIAS] cursor = connection.cursor() cursor.execute('CREATE EXTENSION HSTORE') return result 

Luego, en settings.py debe especificar su corredor de prueba personalizado:

 TEST_RUNNER = 'path.to.my.module.MyTestSuiteRunner' 

Desde mi última respuesta, Django desaprobó y eliminó la señal pre_syncdb . He actualizado la respuesta para acomodar las versiones más recientes. Los mecanismos básicos son idénticos para las versiones más recientes, ya que ambos métodos se basan en las señales y en el código SQL que solo se ejecuta si no existe la extensión HSTORE.

Django 1.8+

Desde que Django introdujo las migraciones de DB, pre_syncdb señales pre_syncdb se marcaron en desuso en 1.7 y se eliminaron completamente en 1.9 . Sin embargo, introdujeron una nueva señal llamada pre_migrate que puede usarse de la misma manera.

 """ 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+ (respuesta original)

Mi sugerencia es utilizar el gancho de señal pre_syncdb .

Ver mi respuesta en la otra pregunta .

 """ 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. 

La señal pre_syncdb se pre_syncdb antes de crear la tabla modelo, lo que lo hace ideal para garantizar que la extensión se instale cuando la base de datos de prueba se está configurando cada vez. El IF NOT EXISTS asegura que PostgreSQL ignora el comando si la extensión ya está instalada. Recibirá un error si ejecuta CREATE EXTENSION en una extensión que ya existe.

Esto funciona para el marco de prueba de unidad de Django predeterminado y lo más probable es que funcione para las pruebas de nariz de Django.

Más información sobre las señales: https://docs.djangoproject.com/en/1.6/ref/signals/#management-signals