扩展存在但uuid_generate_v4失败

アレッ*_*ックス 55 postgresql amazon-ec2 amazon-web-services

在亚马逊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)
Run Code Online (Sandbox Code Playgroud)

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

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

);
Run Code Online (Sandbox Code Playgroud)

这有什么问题?

Cra*_*ger 127

该扩展可用但未安装在此数据库中.

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
Run Code Online (Sandbox Code Playgroud)

  • 该命令应该是```CREATE EXTENSION IF NOT NOT EXISTS"uuid-ossp";``` (14认同)
  • 错误:扩展名"uuid-ossp"已经存在 (5认同)
  • 为了清楚起见,要选择数据库,可以在pgsql控制台中写入\ c <db name> (4认同)

ato*_*ode 12

如果扩展已经存在,但是当您执行describe functions \ _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)
Run Code Online (Sandbox Code Playgroud)

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


Ola*_*nle 8

看起来扩展名未安装在您需要的特定数据库中.

您应该使用连接到此特定数据库

 \CONNECT my_database
Run Code Online (Sandbox Code Playgroud)

然后在此数据库中安装扩展

 CREATE EXTENSION "uuid-ossp";
Run Code Online (Sandbox Code Playgroud)


Bea*_*ker 7

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

public.uuid_generate_v4()
Run Code Online (Sandbox Code Playgroud)


小智 7

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

DROP EXTENSION IF EXISTS "uuid-ossp";
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
Run Code Online (Sandbox Code Playgroud)


小智 6

这对我有用。

create extension IF NOT EXISTS "uuid-ossp" schema pg_catalog version "1.1"; 
Run Code Online (Sandbox Code Playgroud)

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


epo*_*pox 5

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

如果这是全新安装,您可以跳过SETDROP。归功于@atomCode(详细信息

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

CREATE EXTENSION "uuid-ossp" SCHEMA public;
Run Code Online (Sandbox Code Playgroud)

在此之后,您应该在正确的模式中看到uuid_generate_v4()函数\dfpsql命令行提示符中执行查询时)

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

CREATE TABLE public.my_table (
    id uuid DEFAULT public.uuid_generate_v4() NOT NULL,
Run Code Online (Sandbox Code Playgroud)