8
votes

Installation de l'extension HSTORE dans les tests de nez Django

J'ai installé l'extension htstore avec succès et que tout fonctionne lorsque je syncdb . (J'utilise djorm-ext-htstore )

Cependant, le nez crée une nouvelle base de données TEMP pour exécuter des tests dans et HSTORE n'est pas installé dedans.

Je dois exécuter créer une extension htstore; sur le test DB à droite avant la synchronisation du nez la DB, mais je ne trouve aucune information sur la façon de faire ça.

Des idées?


4 commentaires

Vous pouvez vous épargner beaucoup de douleur en créant l'extension sur la base de données Template1 Postgres. Ensuite, toute base de données que vous créez après cela aura l'extension HSTORE.


Rantalaplan, cela aurait dû être la réponse!


C'est bon, j'évite habituellement de donner des réponses à une ligne. Heureux que j'ai aidé.


Lorsque la réponse est une doublure, c'est légitime! Merci beaucoup :-)


6 Réponses :


4
votes

Je suppose que vous utilisez django-nez . Dans ce cas, vous devez créer votre propre testSutuRunner : xxx

puis dans Params.py Vous devez spécifier votre test de test personnalisé: xxx


4 commentaires

Merci! Sans courir cela, je peux voir un problème: si setup_databases () crée des tables. Ne devrions-nous pas créer l'extension en premier?


Je vous ferai savoir quand je l'exécuterai.


Cela ne fonctionne pas, si je mettez d'abord l'extension Create Create, la base de données de test n'est pas là et si je le mettez après le super, il n'est jamais couru, car c'est là que l'erreur a lieu. : - /


Cela fonctionne aussi avec DiscoverRunner (Django.Test.Runner)



26
votes

Il s'agit d'un non-problème: le meilleur moyen de résoudre ce problème est d'appliquer l'extension htstore sur la base de données par défaut, template1

template PSQL -D1 -C 'Créer une extension htstore;'

Référence: Comment créer Une nouvelle base de données avec l'extension htstore déjà installée?


0 commentaires

4
votes

Depuis ma dernière réponse, Django est obsolète et supprimé pré_yncdb signal. J'ai mis à jour la réponse pour accueillir des versions plus récentes. Les mécaniciennes de base sont identiques pour les versions plus récentes, car les deux méthodes reposent sur des signaux et le code SQL qui ne s'exécute que si l'extension HSTORE n'existe pas.

Django 1.8 +

Depuis Django Migration de DB, pré_syncdb Les signaux étaient Marqué obsolète en 1.7 et < Strong> complètement enlevé en 1.9 . Cependant, ils ont introduit un nouveau signal appelé pré_migrate qui peut être utilisé de la même manière. xxx

django 1.6+ (réponse originale)

Ma suggestion est d'utiliser Pre_Syncdb Crochet de signal.

Voir ma réponse sur l'autre question . xxx

pré_syncdb Le signal est tiré avant la création de la table modèle, ce qui le rend idéal pour vous assurer que l'extension est installée lorsque la base de données de test est configurée à chaque fois. Le s'il n'existe pas garantit que PostgreSQL ignore la commande si l'extension est déjà installée. Vous obtiendrez une erreur si vous exécutez créer une extension sur une extension qui existe déjà.

Ceci fonctionne pour le cadre de test de l'unité Django par défaut et travaillera probablement pour les tests de nez Django .

Plus d'infos sur les signaux: https://docs.djangoproject.com/fr/1.6/RF / Signaux / # Gestion-Signaux


0 commentaires

4
votes

Aussi vous pouvez exécuter la commande SQL dans une migration (Django 1.8):

class Migration(migrations.Migration):

    # ...

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


0 commentaires

8
votes

avec Django 1.8 (qui est obsolète maintenant, mais il existe toujours en 3.2): xxx

https://docs.djangoproject.com/fr/3.2/ref/contrib/postgres/fields/#hstorefield

EDIT: Notez juste qu'il y a aussi un JSONFIELD qui traite (ONU) marshalling de JSON déjà et en ligne de recherche. La hstoréextension n'est pas nécessaire pour cela. Nécessite Django> = 1.11 et postgres> = 9.4.


3 commentaires

Cela devrait être la première opération dans la première migration - avant les migrations qui effectuent une opération liée à HSTORE.


C'est une bonne réponse et le seul inconvénient est qu'il faut éditer / modifier manuellement une migration (au moins dans mon cas). Je me demande pourquoi cela n'est pas fait dans le cadre de la migration initiale lorsqu'un HSTORE est utilisé pour la première fois?


L'installation des extensions nécessite des privilèges superutilisateurs à Postgres. Vous pouvez choisir d'installer l'extension en dehors de la configuration Django régulière pour éviter de donner votre système Django ces privilèges.



1
votes

C'est un travail pour moi https://gist.github.com/smcoll/bb2533e4b2ab011b887b XXX

paramètres.py xxx


0 commentaires