Ekstensi ada tetapi uuid_generate_v4 gagal

94

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

Seperti yang Anda lihat, uuid-osspekstensi memang ada. Namun, ketika saya memanggil fungsi untuk pembuatan uuid_v4, gagal:

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

);

Ada apa dengan ini?

ア レ ッ ク ス
sumber
5
Di masa mendatang, harap selalu tampilkan teks persis dari pesan kesalahan apa pun.
Craig Ringer

Jawaban:

194

Ekstensi tersedia tetapi tidak dipasang di database ini.

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
Craig Ringer
sumber
17
Perintahnya harusCREATE EXTENSION IF NOT EXISTS "uuid-ossp";
boatcoder
7
Untuk memperjelas, untuk memilih db seseorang dapat menulis \c <db name>di konsol pgsql
ElementalStorm
@CraigRinger Di mana saya dapat menemukan dokumen ini?
Abhishek Mani
23

Jika ekstensi sudah ada tetapi Anda tidak melihat fungsi uuid_generate_v4 () saat Anda melakukan perintah deskripsikan fungsi \ df maka yang perlu Anda lakukan hanyalah melepaskan ekstensi dan menambahkannya kembali sehingga fungsinya juga ditambahkan. Berikut adalah replikasi masalah:

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)

Apa yang mungkin terjadi adalah bahwa ekstensi awalnya ditambahkan ke cluster di beberapa titik di masa lalu dan kemudian Anda mungkin membuat database baru di dalam cluster itu sesudahnya. Jika itu yang terjadi maka database baru hanya akan "mengetahui" ekstensi tetapi tidak akan memiliki fungsi uuid yang ditambahkan yang terjadi saat Anda menambahkan ekstensi. Karena itu Anda harus menambahkannya kembali.

atomCode
sumber
17

Sepertinya ekstensi tidak dipasang di database tertentu yang Anda butuhkan.

Anda harus terhubung ke database khusus ini dengan

 \CONNECT my_database

Kemudian instal ekstensi di database ini

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

Ini berhasil untuk saya.

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

pastikan ekstensi harus di pg_catalog dan bukan di skema Anda ...

Miguel Becerra
sumber
1

Jika Anda telah mengubah search_path, tentukan skema publik pada fungsi tersebut:

public.uuid_generate_v4()
Beau Barker
sumber
0

jika Anda melakukannya dari perintah unix (selain dari PGAdmin) jangan lupa untuk mengirimkan DB sebagai parameter. jika tidak, ekstensi ini tidak akan diaktifkan saat menjalankan permintaan di DB ini

psql -d -c "buat EKSTENSI pgcrypto;"

odin38.dll
sumber
0

# 1 Instal ulang ekstensi uuid-ossp dalam skema yang tepat:

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

CREATE EXTENSION "uuid-ossp" SCHEMA public;

Jika ini adalah instalasi baru, Anda dapat melewati SETdan DROP. Kredit untuk @atomCode ( detail )

Setelah ini, Anda akan melihat fungsi uuid_generate_v4 () di skema yang benar (saat menjalankan \dfkueri di prompt baris perintah psql ) .

# 2 Gunakan nama yang sepenuhnya memenuhi syarat (dengan schemaname.kualifikasi):

CREATE TABLE public.my_table (
    id uuid DEFAULT public.uuid_generate_v4() NOT NULL,
epox
sumber