【问题标题】:Postgresql: ERROR: type "citext" does not existPostgresql:错误:类型“citext”不存在
【发布时间】:2013-04-05 13:28:33
【问题描述】:

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

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

错误:类型“citext”不存在

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

【问题讨论】:

    标签: postgresql-9.1


    【解决方案1】:

    如果您使用 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 生成的测试数据库。

    【讨论】:

      【解决方案2】:

      要使用citext,请在第一次CreateModel 迁移操作之前使用CITextExtension 操作在PostgreSQL 中设置citext 扩展。

      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

      【讨论】:

      • 非常感谢。当我实现这个时,我进行了 20 次迁移。在迁移 21 中,它的工作原理与将其添加到第一个迁移中一样。
      【解决方案3】:

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

      \c template1
      create extension citext;
      

      那么新的数据库默认会包含 citext。

      【讨论】:

      • 这个答案对我运行 Django unittests 很有帮助,它会自动为测试创建一个新的测试数据库,然后在完成后将其删除。这排除了连接到数据库以创建扩展的能力。
      • +1 保持网站整洁。
      【解决方案4】:

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

      psql =# \c db_1
      CREATE EXTENSION citext;
      
      psql =# \c db_2
      CREATE EXTENSION citext;
      

      希望它可以帮助其他人。谢谢。

      【讨论】:

      • 谢谢!这很有帮助:-)
      • 有没有办法让这个扩展在全球范围内,让每个数据库都可以使用它?
      • 您还可以按照文档docs.djangoproject.com/en/2.1/ref/contrib/postgres/operations/… 中的说明自动执行此过程。请记住,您的 postgres 用户必须是超级用户。
      • 谢谢,它对我有用。对于 pgAdmin 用户:右键单击数据库名称,打开查询工具,然后执行 CREATE EXTENSION citext; 然后您可以在此数据库中创建带有 citext 列的表。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 2017-06-29
      • 1970-01-01
      相关资源
      最近更新 更多