La extensión existe pero uuid_generate_v4 falla
En amazon 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)
Como puede ver, uuid-ossp
la extensión existe. Sin embargo, cuando llamo a la función de generación uuid_v4
, falla:
CREATE TABLE my_table (
id uuid DEFAULT uuid_generate_v4() NOT NULL,
name character varying(32) NOT NULL,
);
¿Qué hay de malo en esto?
La extensión está disponible pero no instalada en esta base de datos.
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
Si la extensión ya está ahí pero no ve la función uuid_generate_v4() cuando ejecuta un comando de descripción de funciones \df , entonces todo lo que necesita hacer es eliminar la extensión y volver a agregarla para que también se agreguen las funciones. Aquí está la replicación del problema:
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)
Lo que probablemente sucedió es que la extensión se agregó originalmente al clúster en algún momento en el pasado y luego probablemente creó una nueva base de datos dentro de ese clúster. Si ese fuera el caso, entonces la nueva base de datos sólo será "consciente" de la extensión pero no tendrá las funciones uuid agregadas, lo que sucede cuando agrega la extensión. Por lo tanto debes volver a agregarlo.
Parece que la extensión no está instalada en la base de datos particular que la necesita.
Debe conectarse a esta base de datos en particular con
\CONNECT my_database
Luego instale la extensión en esta base de datos.
CREATE EXTENSION "uuid-ossp";
Paso 1: reinstale la extensión uuid-ossp en el esquema exacto:
Si se trata de una instalación nueva, puede omitir SET
y DROP
. Créditos a @atomCode ( detalles )
SET search_path TO public;
DROP EXTENSION IF EXISTS "uuid-ossp";
CREATE EXTENSION "uuid-ossp" SCHEMA public;
Después de esto, debería ver la función uuid_generate_v4() EN EL ESQUEMA CORRECTO (cuando se ejecuta \df
la consulta en la línea de comandos de psql ) .
Paso 2: utilice nombres completos (con schemaname.
calificador):
Por ejemplo:
CREATE TABLE public.my_table (
id uuid DEFAULT public.uuid_generate_v4() NOT NULL,