我已经成功地安装了hstore扩展名,当我一切正常syncdb
。 (我使用djorm-EXT-hstore )
然而,鼻子创建一个新的临时数据库来运行测试,hstore未安装它。
我需要运行CREATE EXTENSION HSTORE;
鼻子前的测试数据库权同步的数据库,但我无法找到如何做到这一点的任何信息。
有任何想法吗?
我已经成功地安装了hstore扩展名,当我一切正常syncdb
。 (我使用djorm-EXT-hstore )
然而,鼻子创建一个新的临时数据库来运行测试,hstore未安装它。
我需要运行CREATE EXTENSION HSTORE;
鼻子前的测试数据库权同步的数据库,但我无法找到如何做到这一点的任何信息。
有任何想法吗?
这是一个不是问题的问题:解决这个问题的最好方法是应用默认的数据库上hstore延长, template1
psql -d template1 -c 'create extension hstore;'
参考: 如何创建与hstore扩展已经安装了一个新的数据库?
使用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。
您也可以在迁移(Django的1.8)运行SQL命令:
class Migration(migrations.Migration):
# ...
operations = [
migrations.RunSQL('create extension hstore;'),
# ...
我假设你正在使用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'
自从我上次回答,Django的否定并取消pre_syncdb
信号。 我已经更新了答案,以容纳更多的新版本。 基本机制是较新版本相同的两种方法都依赖于信号和SQL代码,如果HSTORE扩展不存在,只有执行。
由于引入的Django DB迁移, pre_syncdb
信号分别标注为废弃在1.7和1.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.
我的建议是使用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