Rozszerzenie istnieje, ale uuid_generate_v4 nie działa

94

W 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)

Jak widać, uuid-ossprozszerzenie istnieje. Jednak gdy wywołuję funkcję do generacji uuid_v4, kończy się to niepowodzeniem:

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

);

Co w tym złego?

ア レ ッ ク ス
źródło
5
W przyszłości zawsze pokazuj dokładny tekst każdego komunikatu o błędzie.
Craig Ringer

Odpowiedzi:

193

Rozszerzenie jest dostępne, ale nie zostało zainstalowane w tej bazie danych.

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
Craig Ringer
źródło
17
Polecenie powinno brzmiećCREATE EXTENSION IF NOT EXISTS "uuid-ossp";
boatcoder
7
Dla jasności, aby wybrać db, który można zapisać \c <db name>w konsoli pgsql
ElementalStorm
@CraigRinger Gdzie mogę znaleźć ten dokument?
Abhishek Mani
23

Jeśli rozszerzenie już istnieje, ale nie widzisz funkcji uuid_generate_v4 () podczas wykonywania polecenia opisuj funkcje \ df, wszystko, co musisz zrobić, to upuścić rozszerzenie i dodać je ponownie, aby funkcje również zostały dodane. Oto replikacja problemu:

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)

Prawdopodobnie zdarzyło się, że rozszerzenie zostało pierwotnie dodane do klastra w pewnym momencie w przeszłości, a następnie prawdopodobnie utworzono później nową bazę danych w tym klastrze. W takim przypadku nowa baza danych będzie „świadoma” tylko rozszerzenia, ale nie będzie miała dodanych funkcji uuid, co ma miejsce po dodaniu rozszerzenia. Dlatego musisz go ponownie dodać.

atomCode
źródło
17

Wygląda na to, że rozszerzenie nie jest zainstalowane w określonej bazie danych, której potrzebujesz.

Powinieneś połączyć się z tą konkretną bazą danych za pomocą

 \CONNECT my_database

Następnie zainstaluj rozszerzenie w tej bazie danych

 CREATE EXTENSION "uuid-ossp";
Olalekan Sogunle
źródło
4

To zadziałało dla mnie.

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

upewnij się, że rozszerzenie powinno znajdować się w pg_catalog, a nie w twoim schemacie ...

Miguel Becerra
źródło
1

Jeśli zmieniłeś search_path, określ publiczny schemat funkcji:

public.uuid_generate_v4()
Beau Barker
źródło
0

jeśli robisz to z polecenia unixa (oprócz PGAdmin), nie zapomnij przekazać DB jako parametru. w przeciwnym razie to rozszerzenie nie zostanie włączone podczas wykonywania żądań w tej bazie danych

psql -d -c "create EXTENSION pgcrypto;"

odin38
źródło
0

# 1 Zainstaluj ponownie rozszerzenie uuid-ossp w dokładnym schemacie:

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

CREATE EXTENSION "uuid-ossp" SCHEMA public;

Jeśli jest to nowa instalacja, możesz pominąć SETi DROP. Kredyty dla @atomCode ( szczegóły )

Następnie powinieneś zobaczyć funkcję uuid_generate_v4 () w prawym schemacie (podczas wykonywania \dfzapytania w linii poleceń psql ) .

# 2 Użyj w pełni kwalifikowanych nazw (z schemaname.kwalifikatorem):

CREATE TABLE public.my_table (
    id uuid DEFAULT public.uuid_generate_v4() NOT NULL,
epoks
źródło