85

我已经阅读了其他帖子,在搜索时,这个问题的答案。

我正在使用 PostgreSQL 9.1,并使用 'citext' 创建了扩展名CREATE EXTENSION citext,但是当我尝试创建任何类型为 'citext' 的列时,它会引发此错误

错误:类型“citext”不存在

我研究了但没有找到任何具体的答案?知道为什么吗?

4

4 回答 4

134

好的,想通了。我有几个数据库,CREATE EXTENSION citext必须为每个数据库运行才能在该数据库中安装扩展。您必须在 psql 提示符下执行:

psql =# \c db_1
CREATE EXTENSION citext;

psql =# \c db_2
CREATE EXTENSION citext;

希望它可以帮助别人。谢谢你。

于 2013-04-12T21:46:15.573 回答
30

@NullException 是正确的,需要在每个数据库中创建扩展。如果你想自动创建一个扩展,你可以在template1数据库中创建它(默认情况下,至少)是用作“创建数据库”模型的数据库,因此在 psql 中具有适当的权限:

\c template1
create extension citext;

然后新数据库将默认包含 citext。

于 2017-08-31T13:40:10.577 回答
15

要使用,请在第一次迁移操作之前citext使用该操作在 PostgreSQLCITextExtension中设置扩展。citextCreateModel

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

类似于https://docs.djangoproject.com/en/2.2/ref/contrib/postgres/operations/#create-postgresql-extensionsHStoreField _

于 2019-09-11T15:32:57.923 回答
4

如果您使用 Docker,并希望将此扩展添加到您的数据库中,

我做了以下事情,

# 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

还有我的 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

这也将扩展应用于 django 生成的测试数据库。

于 2019-10-20T18:52:37.683 回答