在搜索时,我已阅读其他帖子,回答了这个问题。
我正在使用PostgreSQL 9.1,并使用CREATE EXTENSION citext
创建了扩展名'citext',但是当我尝试创建任何类型为'citext'的列时,它会抛出此错误
错误:类型“citext”不存在
我研究过但没有找到具体的答案?知道为什么吗?
答案 0 :(得分:69)
好的想通了。我有几个数据库,并且必须为每个数据库运行CREATE EXTENSION citext
以在该数据库中安装扩展。您必须在psql提示符上执行:
psql =# \c db_1
CREATE EXTENSION citext;
psql =# \c db_2
CREATE EXTENSION citext;
希望它能帮助别人。谢谢。
答案 1 :(得分:15)
@NullException是正确的,需要在每个数据库中创建扩展。如果要自动创建扩展,可以在template1
数据库中创建它(默认情况下,至少)是用作"创建数据库"的模型的数据库,所以适当的权限,在psql中:
\c template1
create extension citext;
然后默认情况下新数据库将包含citext。
答案 2 :(得分:1)
要使用citext
,请在第一个CITextExtension
迁移操作之前使用citext
操作在PostgreSQL中设置CreateModel
扩展名。
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(),
...
]
与HStoreField
类似,
https://docs.djangoproject.com/en/2.2/ref/contrib/postgres/operations/#create-postgresql-extensions
答案 3 :(得分:0)
如果您使用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生成的测试数据库。