L'extension existe mais uuid_generate_v4 échoue

94

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

Comme vous pouvez le voir, l' uuid-osspextension existe. Cependant, lorsque j'appelle la fonction pour la génération uuid_v4, elle échoue:

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

);

Quel est le problème avec ça?

ア レ ッ ク ス
la source
5
À l'avenir, veuillez toujours afficher le texte exact de tout message d'erreur.
Craig Ringer

Réponses:

194

L'extension est disponible mais pas installée dans cette base de données.

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
Craig Ringer
la source
17
La commande devrait êtreCREATE EXTENSION IF NOT EXISTS "uuid-ossp";
boatcoder
7
Juste pour être clair, pour sélectionner la base de données, on peut écrire \c <db name>dans la console pgsql
ElementalStorm
@CraigRinger Où puis-je trouver ce document?
Abhishek Mani
23

Si l'extension est déjà là mais que vous ne voyez pas la fonction uuid_generate_v4 () lorsque vous exécutez une commande describe functions \ df, tout ce que vous avez à faire est de supprimer l'extension et de la rajouter pour que les fonctions soient également ajoutées. Voici la réplication du problème:

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)

Ce qui s'est probablement passé, c'est que l'extension a été initialement ajoutée au cluster à un moment donné dans le passé, puis vous avez probablement créé une nouvelle base de données dans ce cluster par la suite. Si tel était le cas, alors la nouvelle base de données ne sera "consciente" que de l'extension mais elle n'aura pas les fonctions uuid ajoutées, ce qui se produit lorsque vous ajoutez l'extension. Par conséquent, vous devez le rajouter.

atomCode
la source
17

Il semble que l'extension n'est pas installée dans la base de données particulière dont vous avez besoin.

Vous devez vous connecter à cette base de données particulière avec

 \CONNECT my_database

Ensuite, installez l'extension dans cette base de données

 CREATE EXTENSION "uuid-ossp";
Olalekan Sogunle
la source
4

Cela a fonctionné pour moi.

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

assurez-vous que l'extension doit figurer sur pg_catalog et non dans votre schéma ...

Miguel Becerra
la source
1

Si vous avez modifié le search_path, spécifiez le schéma public sur la fonction:

public.uuid_generate_v4()
Beau Barker
la source
0

si vous le faites à partir de la commande unix (en dehors de PGAdmin), n'oubliez pas de passer le DB en paramètre. sinon cette extension ne sera pas activée lors de l'exécution des requêtes sur ce DB

psql -d -c "créer une EXTENSION pgcrypto;"

odin38
la source
0

# 1 Réinstallez l'extension uuid-ossp dans un schéma exact:

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

CREATE EXTENSION "uuid-ossp" SCHEMA public;

S'il s'agit d'une nouvelle installation, vous pouvez ignorer SETet DROP. Crédits à @atomCode ( détails )

Après cela, vous devriez voir la fonction uuid_generate_v4 () dans le schéma de droite (lors de l'exécution de la \dfrequête dans l' invite de ligne de commande psql ) .

# 2 Utilisez des noms complets (avec schemaname.qualificatif):

CREATE TABLE public.my_table (
    id uuid DEFAULT public.uuid_generate_v4() NOT NULL,
épox
la source