Die Erweiterung ist vorhanden, aber uuid_generate_v4 schlägt fehl

93

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

Wie Sie sehen können, uuid-osspgibt es eine Erweiterung. Wenn ich jedoch die Funktion zur Generierung uuid_v4aufrufe, schlägt dies fehl:

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

);

Was ist daran falsch?

ア レ ッ ク ス
quelle
5
Bitte zeigen Sie in Zukunft immer den genauen Text einer Fehlermeldung an.
Craig Ringer

Antworten:

191

Die Erweiterung ist verfügbar, aber nicht in dieser Datenbank installiert .

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
Craig Ringer
quelle
17
Der Befehl sollte seinCREATE EXTENSION IF NOT EXISTS "uuid-ossp";
Bootscodierer
7
Nur um klar zu sein, um die \c <db name>Datenbank auszuwählen, die man in die pgsql-Konsole schreiben kann
ElementalStorm
@CraigRinger Wo finde ich dieses Dokument?
Abhishek Mani
23

Wenn die Erweiterung bereits vorhanden ist, Sie jedoch die Funktion uuid_generate_v4 () nicht sehen, wenn Sie einen Befehl zum Beschreiben von Funktionen \ df ausführen, müssen Sie die Erweiterung nur löschen und erneut hinzufügen, damit auch die Funktionen hinzugefügt werden. Hier ist die Problemreplikation:

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)

Was wahrscheinlich passiert ist, ist, dass die Erweiterung ursprünglich zu einem früheren Zeitpunkt zum Cluster hinzugefügt wurde und Sie anschließend wahrscheinlich eine neue Datenbank innerhalb dieses Clusters erstellt haben. Wenn dies der Fall ist, wird die neue Datenbank nur die Erweiterung "kennen", aber es werden nicht die UUID-Funktionen hinzugefügt, was passiert, wenn Sie die Erweiterung hinzufügen. Daher müssen Sie es erneut hinzufügen.

atomCode
quelle
17

Anscheinend ist die Erweiterung nicht in der Datenbank installiert, die Sie benötigen.

Sie sollten eine Verbindung zu dieser bestimmten Datenbank mit herstellen

 \CONNECT my_database

Installieren Sie dann die Erweiterung in dieser Datenbank

 CREATE EXTENSION "uuid-ossp";
Olalekan Sogunle
quelle
4

Das hat bei mir funktioniert.

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

Stellen Sie sicher, dass die Erweiterung auf pg_catalog und nicht in Ihrem Schema angezeigt wird ...

Miguel Becerra
quelle
0

Wenn Sie dies über den Unix-Befehl (außer PGAdmin) tun, vergessen Sie nicht, die Datenbank als Parameter zu übergeben. Andernfalls wird diese Erweiterung nicht aktiviert, wenn Anforderungen in dieser Datenbank ausgeführt werden

psql -d -c "create EXTENSION pgcrypto;"

odin38
quelle
0

# 1 Installieren Sie die uuid-ossp-Erweiterung in einem genauen Schema neu:

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

CREATE EXTENSION "uuid-ossp" SCHEMA public;

Wenn dies eine Neuinstallation ist, können Sie SETund überspringen DROP. Credits zu @atomCode ( Details )

Danach sollte die Funktion uuid_generate_v4 () im rechten Schema angezeigt werden ( wenn die \dfAbfrage in der Eingabeaufforderung psql ausgeführt wird) .

# 2 Verwenden Sie vollqualifizierte Namen (mit schemaname.Qualifizierer):

CREATE TABLE public.my_table (
    id uuid DEFAULT public.uuid_generate_v4() NOT NULL,
Epox
quelle
0

Wenn Sie das geändert haben search_path, geben Sie das öffentliche Schema für die Funktion an:

public.uuid_generate_v4()
Beau Barker
quelle