A extensão existe, mas uuid_generate_v4 falha

99

No 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 você pode ver, a uuid-osspextensão existe. No entanto, quando chamo a função de geração uuid_v4, ela falha:

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

);

O que há de errado nisso?

ア レ ッ ク ス
fonte
5
No futuro, sempre mostre o texto exato de qualquer mensagem de erro.
Craig Ringer

Respostas:

210

A extensão está disponível, mas não instalada neste banco de dados.

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
Craig Ringer
fonte
17
O comando deve serCREATE EXTENSION IF NOT EXISTS "uuid-ossp";
boatcoder
7
Só para ficar claro, para selecionar o db pode-se escrever \c <db name>no console do pgsql
ElementalStorm
@CraigRinger Onde posso encontrar este documento?
Abhishek Mani de
25

Se a extensão já estiver lá, mas você não vir a função uuid_generate_v4 () ao executar um comando describe functions \ df, então tudo que você precisa fazer é eliminar a extensão e adicioná-la novamente para que as funções também sejam adicionadas. Aqui está a replicação do 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)

O que provavelmente aconteceu é que a extensão foi originalmente adicionada ao cluster em algum ponto no passado e, em seguida, você provavelmente criou um novo banco de dados dentro desse cluster posteriormente. Se for esse o caso, o novo banco de dados estará apenas "ciente" da extensão, mas não terá as funções uuid adicionadas, o que acontece quando você adiciona a extensão. Portanto, você deve adicioná-lo novamente.

atomCode
fonte
17

Parece que a extensão não está instalada no banco de dados específico que você precisa.

Você deve se conectar a este banco de dados específico com

 \CONNECT my_database

Em seguida, instale a extensão neste banco de dados

 CREATE EXTENSION "uuid-ossp";
Olalekan Sogunle
fonte
5

Isso funcionou para mim.

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

certifique-se de que a extensão deve estar em pg_catalog e não em seu esquema ...

Miguel Becerra
fonte
2

Se você alterou o search_path, especifique o esquema público na função:

public.uuid_generate_v4()
Beau Barker
fonte
0

se você fizer isso a partir do comando unix (além do PGAdmin) não se esqueça de passar o DB como um parâmetro. caso contrário, esta extensão não será habilitada ao executar solicitações neste banco de dados

psql -d -c "criar EXTENSÃO pgcrypto;"

odin38
fonte
0

# 1 Reinstale a extensão uuid-ossp em um esquema exato:

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

CREATE EXTENSION "uuid-ossp" SCHEMA public;

Se esta for uma instalação nova, você pode ignorar SETe DROP. Créditos para @atomCode ( detalhes )

Depois disso, você verá a função uuid_generate_v4 () no esquema correto (ao executar a \dfconsulta no prompt de linha de comando do psql ) .

# 2 Use nomes totalmente qualificados (com schemaname.qualificador):

CREATE TABLE public.my_table (
    id uuid DEFAULT public.uuid_generate_v4() NOT NULL,
epóxi
fonte