90 votes

Postgresql : ERROR : le type "citext" n'existe pas.

J'ai lu d'autres messages, en cherchant, une réponse à cette question.

J'utilise PostgreSQL 9.1, et j'ai créé l'extension 'citext' à l'aide de la fonction CREATE EXTENSION citext mais lorsque j'essaie de créer des colonnes de type "citext", l'erreur suivante se produit

ERROR : le type "citext" n'existe pas.

J'ai fait des recherches mais je n'ai pas trouvé de réponses concrètes ? Savez-vous pourquoi ?

140voto

NullException Points 2601

Ok, j'ai compris. J'ai plusieurs bases de données et CREATE EXTENSION citext doit être exécuté pour chaque base de données pour installer l'extension dans cette base. Vous devez le faire à l'invite psql :

psql =# \c db_1
CREATE EXTENSION citext;

psql =# \c db_2
CREATE EXTENSION citext;

J'espère que cela aidera d'autres personnes. Merci.

30voto

shaunc Points 545

@NullException a raison de dire que l'extension doit être créée dans chaque base de données. Si vous souhaitez qu'une extension soit automatiquement créée, vous pouvez la créer dans le fichier template1 qui (par défaut, du moins) est la base de données utilisée comme modèle pour "create database", donc avec les permissions appropriées, dans psql :

\c template1
create extension citext;

Les nouvelles bases de données incluront alors le citext par défaut.

15voto

Ilya Petukhov Points 414

Pour utiliser citext utilisez le CITextExtension pour configurer l'opération citext dans PostgreSQL avant la première CreateModel l'opération de migration.

https://docs.djangoproject.com/en/2.2/ref/contrib/postgres/fields/#citext-fields

from django.contrib.postgres.operations import CITextExtension

class Migration(migrations.Migration):
    ...

    operations = [
        CITextExtension(),
        ...
    ]

de la même manière que HStoreField comme https://docs.djangoproject.com/en/2.2/ref/contrib/postgres/operations/#create-postgresql-extensions

4voto

Viktor Johansson Points 191

Si vous utilisez Docker, et que vous souhaitez ajouter cette extension à votre base de données,

J'ai fait ce qui suit,

# Dockerfile
FROM postgres:11.3

# Adds the CIText Extension to our database
COPY ./compose/production/postgres/initdb_citext.sh /docker-entrypoint-initdb.d/citext.sh

Et mon initdb_citext.sh :

#!/bin/sh

# Adds the citext extension to database and test database
"${psql[@]}" <<- 'EOSQL'
CREATE EXTENSION IF NOT EXISTS citext;
\c template1
CREATE EXTENSION IF NOT EXISTS citext;
EOSQL

Cela applique l'extension aux bases de données de test que django génère également.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X