Uzantı var ancak uuid_generate_v4 başarısız oluyor


95

Amazon ec2 RDS Postgresql'de:

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

Gördüğünüz gibi, uuid-osspuzantı var. Ancak, işlevi nesil için çağırdığımda uuid_v4başarısız oluyor:

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

);

Bunun nesi var?


5
Gelecekte lütfen her zaman herhangi bir hata mesajının tam metnini gösterin .
Craig Ringer

Yanıtlar:


196

Uzantı mevcut ancak bu veritabanında yüklü değil .

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

17
Komut şöyle olmalıdırCREATE EXTENSION IF NOT EXISTS "uuid-ossp";
boatcoder

7
Sadece yazabilir db birini seçmek için, açık olmak \c <db name>pgsql konsolunda
ElementalStorm

@CraigRinger Bu dokümanı nerede bulabilirim?
Abhishek Mani

24

Uzantı zaten oradaysa, ancak bir işlevleri açıkla \ df komutu yaptığınızda uuid_generate_v4 () işlevini görmüyorsanız, yapmanız gereken tek şey uzantıyı bırakmak ve işlevlerin de eklenmesi için yeniden eklemektir. İşte sorunun çoğaltılması:

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)

Muhtemelen olan şey, uzantının başlangıçta kümeye geçmişte bir noktada eklenmiş olması ve daha sonra muhtemelen bu kümede yeni bir veritabanı oluşturmuş olmanızdır. Durum buysa, yeni veritabanı yalnızca uzantının "farkında" olacaktır, ancak uzantıyı eklediğinizde gerçekleşen uuid işlevlerine sahip olmayacaktır. Bu nedenle yeniden eklemelisiniz.


17

Görünüşe göre uzantı, ihtiyaç duyduğunuz belirli veritabanına yüklenmemiş.

Bu belirli veri tabanına şu şekilde bağlanmalısınız:

 \CONNECT my_database

Ardından uzantıyı bu veritabanına yükleyin

 CREATE EXTENSION "uuid-ossp";

4

Bu benim için çalıştı.

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

uzantının şemanızda değil pg_catalog'da olduğundan emin olun ...


1

Öğesini değiştirdiyseniz search_path, işlevde genel şemayı belirtin:

public.uuid_generate_v4()

0

eğer bunu unix komutundan yaparsanız (PGAdmin dışında) DB'yi parametre olarak iletmeyi unutmayın. aksi takdirde bu uzantı, bu DB'de istekler yürütülürken etkinleştirilmeyecektir

psql -d -c "UZANTI pgcrypto oluştur;"


0

# 1 uuid-ossp uzantısını tam bir şemada yeniden yükleyin:

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

CREATE EXTENSION "uuid-ossp" SCHEMA public;

Bu yeni bir kurulumsa SETve atlayabilirsiniz DROP. @AtomCode kredisi ( ayrıntılar )

Bundan sonra , doğru şemada uuid_generate_v4 () işlevini görmelisiniz ( psql komut satırı isteminde sorgu çalıştırıldığında )\df .

# 2 Tam nitelikli isimler kullanın ( schemaname.niteleyici ile):

CREATE TABLE public.my_table (
    id uuid DEFAULT public.uuid_generate_v4() NOT NULL,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.