扩展存在,但 uuid _ create _ v4失败

返回文章页面亚马逊网站译者:

=> 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,


);

这有什么问题吗?

194181 次浏览

这个数据库中的扩展名是 有空,而不是 安装

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

如果扩展名已经存在,但是在执行描述函数 < em > df 命令时没有看到 uuid _ gener_ 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 函数,当您添加扩展时会发生这种情况。因此,您必须重新添加它。

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

创建扩展 pgcrypto;

看起来扩展没有安装在您需要的特定数据库中。

连接到这个特定的数据库时,应该使用

 \CONNECT my_database

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

 CREATE EXTENSION "uuid-ossp";

这招对我很管用。

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

确保扩展应该通过 pg _ catalog,而不是在您的模式中..。

步骤 # 1: 将 uuid-ossp 扩展重新安装到确切的模式中:

如果这是一个全新的安装,您可以跳过 SETDROP.Credits 到@atomCode (详情)

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


CREATE EXTENSION "uuid-ossp" SCHEMA public;

在这之后,您应该会看到 Uuid _ create _ v4()函数出现在 RIGHT SCHEMA (在 < em > psql 中执行 \df查询时命令行提示符中) 。

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

例如:

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

如果更改了 search_path,请在函数调用中指定 public模式:

public.uuid_generate_v4()

也许和我面对的是同一个人。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";

只需将此代码添加到脚本的开始部分

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