La extensión existe pero uuid_generate_v4 falla

94

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, la uuid-osspextensión existe. Sin embargo, cuando llamo a la función para la generación uuid_v4, falla:

CREATE TABLE my_table (
    id uuid DEFAULT uuid_generate_v4() NOT NULL,
    name character varying(32) NOT NULL,

);

¿Qué pasa con esto?

ア レ ッ ク ス
fuente
5
En el futuro, muestre siempre el texto exacto de cualquier mensaje de error.
Craig Ringer

Respuestas:

193

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

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
Craig Ringer
fuente
17
El comando debería serCREATE EXTENSION IF NOT EXISTS "uuid-ossp";
boatcoder
7
Para que quede claro, para seleccionar la base de datos se puede escribir \c <db name>en la consola pgsql
ElementalStorm
@CraigRinger ¿Dónde puedo encontrar este documento?
Abhishek Mani
23

Si la extensión ya está allí pero no ve la función uuid_generate_v4 () cuando ejecuta un comando describe functions \ df, entonces todo lo que necesita hacer es soltar la extensión y volver a agregarla para que las funciones también se agreguen. 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 después. Si ese fuera el caso, entonces la nueva base de datos solo será "consciente" de la extensión, pero no tendrá las funciones uuid agregadas, lo que sucede cuando agrega la extensión. Por lo tanto, debe volver a agregarlo.

atomCode
fuente
17

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
fuente
4

Esto funcionó para mí.

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

asegúrese de que la extensión debe estar en pg_catalog y no en su esquema ...

Miguel Becerra
fuente
1

Si ha cambiado search_path, especifique el esquema público en la función:

public.uuid_generate_v4()
Beau Barker
fuente
0

si lo hace desde el comando Unix (aparte de PGAdmin) no olvide pasar la base de datos como parámetro. de lo contrario, esta extensión no se habilitará al ejecutar solicitudes en esta base de datos

psql -d -c "crea EXTENSIÓN pgcrypto;"

odin38
fuente
0

# 1 Vuelva a instalar la extensión uuid-ossp en un esquema exacto:

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

CREATE EXTENSION "uuid-ossp" SCHEMA public;

Si se trata de una instalación nueva, puede omitir SETy DROP. Créditos a @atomCode ( detalles )

Después de esto, debería ver la función uuid_generate_v4 () en el esquema correcto (cuando se ejecuta la \dfconsulta en la línea de comandos de psql ) .

# 2 Use nombres completamente calificados (con schemaname.calificador):

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