在亚马逊 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";
步骤 #1:将 uuid-ossp 扩展重新安装到确切的架构中:
如果这是全新安装,您可以跳过 SET
和 DROP
。归功于@atomCode (details)
SET search_path TO public;
DROP EXTENSION IF EXISTS "uuid-ossp";
CREATE EXTENSION "uuid-ossp" SCHEMA public;
在此之后,您应该会在正确的架构中看到 uuid_generate_v4() 函数(在 psql 命令行提示符中执行 \df
查询时)。
步骤 #2:使用完全限定名称(带有 schemaname.qualifier):
例如:
CREATE TABLE public.my_table (
id uuid DEFAULT public.uuid_generate_v4() NOT NULL,
如果您更改了 search_path
,请在函数调用中指定 public
架构:
public.uuid_generate_v4()
这对我有用。
create extension IF NOT EXISTS "uuid-ossp" schema pg_catalog version "1.1";
确保扩展名应该在 pg_catalog 上而不是在你的架构中......
只需将此代码添加到脚本的开头
DROP EXTENSION IF EXISTS "uuid-ossp";
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
如果您从 unix 命令(PGAdmin 除外)执行此操作,请不要忘记将 DB 作为参数传递。否则在此 DB 上执行请求时将不会启用此扩展
psql -d -c "创建扩展 pgcrypto;"
也许这就是我所面临的。 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";
不定期副业成功案例分享
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
\c <db name>
sudo -u postgres psql <db_name>
<br>从那里我按照指示运行CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
。