113

I have read other posts, when searching, an answer to this question.

I am using PostgreSQL 9.1, and created extension 'citext' using CREATE EXTENSION citext, but when I try to create any columns of type 'citext', it throws this error

ERROR: type "citext" does not exist

I researched but did not find any concrete answers? Any idea why?

4 Answers 4

173

Ok figured it out. I have several databases and CREATE EXTENSION citext has to be run for each db to install the extension in that DB. You must do on psql prompt:

psql =# \c db_1 CREATE EXTENSION citext; psql =# \c db_2 CREATE EXTENSION citext; 
Sign up to request clarification or add additional context in comments.

4 Comments

Is there any way of making this extension globally, so that every database can use it?
You can also automate this process as described in the docs docs.djangoproject.com/en/2.1/ref/contrib/postgres/operations/…. Remember that your postgres user needs to be superuser.
Thanks, it worked for me. For pgAdmin Users: Right-click on the Database name, open the Query Tool, and simply execute CREATE EXTENSION citext; Then you can create tables with citext columns in this database.
34

@NullException is correct that the extension needs to be created in each database. If you want to automatically have an extension created, you can create it in the template1 database which (by default, at least) is the database used as a model for "create database", so with appropriate permissions, in psql:

\c template1 create extension citext; 

Then new databases will include citext by default.

2 Comments

This answer was helpful for me in running Django unittests which automatically creates a new test database for the tests and then drops it when done. That precludes the ability to connect to the database to create the extension.
+1 for keeping the site tidy.
21

To use citext, use the CITextExtension operation to setup the citext extension in PostgreSQL before the first CreateModel migration operation.

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(), ... ] 

similarly to HStoreField as https://docs.djangoproject.com/en/2.2/ref/contrib/postgres/operations/#create-postgresql-extensions

1 Comment

Thanks a bunch for this. I was 20 migrations deep when I implemented this. On migration 21, it works just as well as adding it into the first migration.
4

If you use Docker, and want to add this extension to your database,

I have done the following,

# 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 

And my 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 

This applies the extension to test databases that django generates too.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.