拡張機能は存在しますが、uuid_generate_v4が失敗します


98

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)

ご覧のとおり、uuid-ossp拡張機能は存在します。ただし、生成のために関数を呼び出すと、uuid_v4失敗します。

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

);

これの何が問題になっていますか?


5
今後、エラーメッセージの正確なテキストを常に表示してください。
クレイグリンガー

回答:


208

拡張機能は使用可能ですが、このデータベースにはインストールされていません。

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

17
コマンドは次のようになりますCREATE EXTENSION IF NOT EXISTS "uuid-ossp";
boatcoder 2016

7
ただ、書くことができますデシベルのいずれかを選択するために、明確にすること\c <db name>pgsqlのコンソールに
ElementalStorm

@CraigRingerこのドキュメントはどこにありますか?
AbhishekMani19年

25

拡張機能がすでに存在するが、describe Functions \ dfコマンドを実行したときにuuid_generate_v4()関数が表示されない場合は、拡張機能を削除して再度追加するだけで、関数も追加されます。問題の複製は次のとおりです。

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)

おそらく起こったことは、拡張機能が元々過去のある時点でクラスターに追加され、その後、そのクラスター内に新しいデータベースを作成したことです。その場合、新しいデータベースは拡張機能を「認識」するだけですが、拡張機能を追加したときに発生するuuid関数は追加されません。したがって、再度追加する必要があります。


17

拡張機能が、必要な特定のデータベースにインストールされていないようです。

この特定のデータベースに接続する必要があります

 \CONNECT my_database

次に、このデータベースに拡張機能をインストールします

 CREATE EXTENSION "uuid-ossp";

5

これは私のために働いた。

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

拡張機能がスキーマではなくpg_catalogにあることを確認してください...


2

を変更した場合search_pathは、関数でパブリックスキーマを指定します。

public.uuid_generate_v4()

0

UNIXコマンド(PGAdminを除く)から実行する場合は、DBをパラメーターとして渡すことを忘れないでください。そうしないと、このDBでリクエストを実行するときに、この拡張機能が有効になりません。

psql -d -c "create EXTENSION pgcrypto;"


0

#1正確なスキーマにuuid-ossp拡張を再インストールします。

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

CREATE EXTENSION "uuid-ossp" SCHEMA public;

これが新規インストールの場合は、スキップSETしてDROP。@atomCodeへのクレジット(詳細

この後、正しいスキーマにuuid_generate_v4()関数が表示されますpsqlコマンドラインプロンプトで\dfクエリを実行する場合)

#2完全修飾名を使用する(schemaname.修飾子付き):

CREATE TABLE public.my_table (
    id uuid DEFAULT public.uuid_generate_v4() NOT NULL,
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.