La extensión existe pero uuid_generate_v4 falla

Resuelto Incerteza asked hace 54 años • 16 respuestas

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-osspla 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?

Incerteza avatar Jan 01 '70 08:01 Incerteza
Aceptado

La extensión está disponible pero no instalada en esta base de datos.

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
Craig Ringer avatar Mar 17 '2014 03:03 Craig Ringer

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.

atomCode avatar Oct 12 '2016 20:10 atomCode

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";
Olalekan Sogunle avatar Jan 29 '2017 14:01 Olalekan Sogunle

Paso 1: reinstale la extensión uuid-ossp en el esquema exacto:

Si se trata de una instalación nueva, puede omitir SETy 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 \dfla 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,
epox avatar Aug 06 '2020 14:08 epox