安装hstore扩展在Django鼻子测试(Installing hstore extension

2019-09-01 20:27发布

我已经成功地安装了hstore扩展名,当我一切正常syncdb 。 (我使用djorm-EXT-hstore )

然而,鼻子创建一个新的临时数据库来运行测试,hstore未安装它。

我需要运行CREATE EXTENSION HSTORE; 鼻子前的测试数据库权同步的数据库,但我无法找到如何做到这一点的任何信息。

有任何想法吗?

Answer 1:

这是一个不是问题的问题:解决这个问题的最好方法是应用默认的数据库上hstore延长, template1

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

参考: 如何创建与hstore扩展已经安装了一个新的数据库?



Answer 2:

使用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

编辑:只是注意,也有一个JSONField它处理(UN)的JSON编组已经和在线搜索。 该HStoreExtension是没有必要的。 需要的Django> = 1.11和Postgres> = 9.4。



Answer 3:

您也可以在迁移(Django的1.8)运行SQL命令:

class Migration(migrations.Migration):

    # ...

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


Answer 4:

我假设你正在使用Django的鼻子 。 在这种情况下,你应该创建自己的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

然后在settings.py您应该指定您的自定义测试运行:

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


Answer 5:

自从我上次回答,Django的否定并取消pre_syncdb信号。 我已经更新了答案,以容纳更多的新版本。 基本机制是较新版本相同的两种方法都依赖于信号和SQL代码,如果HSTORE扩展不存在,只有执行。

Django的1.8+

由于引入的Django DB迁移, pre_syncdb信号分别标注为废弃在1.71.9完全除去 。 然而,他们推出了新的信号称为pre_migrate可以使用相同的方式。

"""
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+(原来的答案)

我的建议是使用pre_syncdb信号挂钩。

见我对对方的回答问题 。

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

pre_syncdb创建模型表之前,信号被触发,非常适合以确保安装扩展时被设定的测试数据库每次上。 该IF NOT EXISTS确保PostgreSQL的忽略命令,如果已经安装了扩展。 如果你运行你会得到一个错误CREATE EXTENSION上已存在的扩展。

这适用于默认的Django的单元测试框架,并将Django的鼻子测试最有可能的工作。

在信号更多信息: https://docs.djangoproject.com/en/1.6/ref/signals/#management-signals



文章来源: Installing hstore extension in django nose tests