在亚马逊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,
);
这有什么问题?
该扩展可用但未安装在此数据库中。
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
如果扩展已经存在,但是当您执行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)
可能发生的是,扩展最初是在过去的某个时刻添加到集群中的,然后您可能在之后的集群中创建了一个新的数据库。如果是这种情况,那么新数据库将只“知道”扩展名,但它不会添加添加扩展名时发生的uuid功能。因此,您必须重新添加它。
看起来扩展名未安装在您需要的特定数据库中。
您应该使用连接到此特定数据库
\CONNECT my_database
然后在此数据库中安装扩展
CREATE EXTENSION "uuid-ossp";
如果你从unix命令(除PGAdmin之外)执行此操作,请不要忘记将DB作为参数传递。否则在此DB上执行请求时将不会启用此扩展
psql -d -c“create EXTENSION pgcrypto;”