【问题标题】:Extension exists but uuid_generate_v4 fails扩展存在但 uuid_generate_v4 失败
【发布时间】:2014-04-22 04:37:26
【问题描述】:

在亚马逊 ec2 RDS Postgresql:

=> SHOW rds.extensions;

rds.extensions                                                                                                                                 
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 btree_gin,btree_gist,chkpass,citext,cube,dblink,dict_int,dict_xsyn,earthdistance,fuzzystrmatch,hstore,intagg,intarray,isn,ltree,pgcrypto,pgrowlocks,pg_trgm,plperl,plpgsql,pltcl,postgis,postgis_tiger_geocoder,postgis_topology,sslinfo,tablefunc,tsearch2,unaccent,uuid-ossp
(1 row)

如您所见,uuid-ossp 扩展名确实存在。但是,当我调用生成 uuid_v4 的函数时,它会失败:

CREATE TABLE my_table (
    id uuid DEFAULT uuid_generate_v4() NOT NULL,
    name character varying(32) NOT NULL,

);

这是怎么回事?

【问题讨论】:

  • 今后,请始终显示任何错误消息的准确文本
  • 是的扩展存在,但数据库可能处于不一致的状态。可能发生的一个原因是如果您删除架构但保留扩展名。为避免这种情况,运行 DROP EXTENSION IF EXISTS "uuid-ossp" CASCADE 是一个很好的策略;然后创建扩展“uuid-ossp”; (请参阅下面@atomCode的答案中的详细说明)

标签: postgresql amazon-web-services amazon-ec2


【解决方案1】:

该扩展程序可用,但未在此数据库中安装

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

【讨论】:

  • 命令应该是CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
  • 要明确一点,选择db可以在pgsql控制台写\c <db name>
  • @CraigRinger 在哪里可以找到这个文档?
  • 在 pgsql 控制台中运行 \c 时,出现身份验证错误。我设法使用 Ubuntu 命令行解决了这个问题。 sudo -u postgres psql <db_name>
    从那里我按照指示运行 CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
【解决方案2】:

如果扩展已经存在,但在执行描述函数 \df 命令时看不到 uuid_generate_v4() 函数,那么您需要做的就是删除扩展并重新添加它,以便也添加功能。这是问题复制:

db=# \df
                       List of functions
 Schema | Name | Result data type | Argument data types | Type
--------+------+------------------+---------------------+------
(0 rows)
CREATE EXTENSION "uuid-ossp";
ERROR:  extension "uuid-ossp" already exists
DROP EXTENSION "uuid-ossp";
CREATE EXTENSION "uuid-ossp";
db=# \df
                                  List of functions
 Schema |        Name        | Result data type |    Argument data types    |  Type
--------+--------------------+------------------+---------------------------+--------
 public | uuid_generate_v1   | uuid             |                           | normal
 public | uuid_generate_v1mc | uuid             |                           | normal
 public | uuid_generate_v3   | uuid             | namespace uuid, name text | normal
 public | uuid_generate_v4   | uuid             |                           | normal

db=# select uuid_generate_v4();
           uuid_generate_v4
--------------------------------------
 b19d597c-8f54-41ba-ba73-02299c1adf92
(1 row)

可能发生的情况是,扩展最初是在过去的某个时间添加到集群中的,然后您可能随后在该集群中创建了一个新数据库。如果是这种情况,那么新数据库将仅“知道”扩展名,但不会添加 uuid 函数,这在您添加扩展名时会发生。因此,您必须重新添加它。

【讨论】:

  • 是的,我也遇到了这个问题,你在这里描述的解决了它
【解决方案3】:

如果您通过 unix 命令(PGAdmin 除外)执行此操作,请不要忘记将 DB 作为参数传递。否则在此 DB 上执行请求时将不会启用此扩展

psql -d -c "创建扩展 pgcrypto;"

【讨论】:

    【解决方案4】:

    该扩展似乎未安装在您需要的特定数据库中。

    您应该使用

    连接到这个特定的数据库
     \CONNECT my_database
    

    然后在这个数据库中安装扩展

     CREATE EXTENSION "uuid-ossp";
    

    【讨论】:

      【解决方案5】:

      这对我有用。

      create extension IF NOT EXISTS "uuid-ossp" schema pg_catalog version "1.1"; 
      

      确保扩展应该在 pg_catalog 上而不是在你的架构中...

      【讨论】:

        【解决方案6】:

        第 1 步:将 uuid-ossp 扩展重新安装到确切的架构中:

        如果这是全新安装,您可以跳过 SETDROP。感谢@atomCode (details)

        SET search_path TO public;
        DROP EXTENSION IF EXISTS "uuid-ossp";
        
        CREATE EXTENSION "uuid-ossp" SCHEMA public;
        

        在此之后,您应该会在正确的架构中看到 uuid_generate_v4() 函数(在 psql 命令行提示符中执行 \df 查询时) em>。

        第 2 步:使用完全限定名称(带有 schemaname. 限定符):

        例如:

        CREATE TABLE public.my_table (
            id uuid DEFAULT public.uuid_generate_v4() NOT NULL,
        

        【讨论】:

        • 谢谢。我首先通过删除并创建带有架构的扩展名来创建,但它没有用,接下来我去默认并编写 schema.uuid_generate_v4() 来解决问题。
        【解决方案7】:

        如果您更改了search_path,请在函数调用中指定public 架构:

        public.uuid_generate_v4()
        

        【讨论】:

          【解决方案8】:

          也许这就是我所面临的。 uuid_generate_v4 来自 public 架构,我试图在特定架构中运行它,所以我做了修复它:

          SET search_path TO specific_schema;
          
          INSERTO INTO my_table VALUES public.uuid_generate_v4();
          

          您可以检查您的函数正在运行的架构:

          \df uuid_generate_v4
          

          或者

          SELECT n.nspname, p.probin, p.proname
          FROM
              pg_proc p
              LEFT JOIN pg_namespace n ON p.pronamespace = n.oid
          WHERE p.proname like 'uuid_generate_v4';
          

          您可以像这样查看与 uuid-ossp 扩展相关的信息:

          SELECT * FROM pg_extension WHERE extname LIKE 'uuid-ossp';
          

          你可以添加这个你还没有的扩展案例:

          CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
          

          【讨论】:

            【解决方案9】:

            只需将此代码添加到脚本的开头

            DROP EXTENSION IF EXISTS "uuid-ossp";
            CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2014-12-20
              • 2012-05-20
              • 2013-04-14
              • 1970-01-01
              • 2020-07-24
              • 2011-05-25
              • 2013-08-08
              相关资源
              最近更新 更多