W 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)
Jak widać, uuid-ossp
rozszerzenie istnieje. Jednak gdy wywołuję funkcję do generacji uuid_v4
, kończy się to niepowodzeniem:
CREATE TABLE my_table (
id uuid DEFAULT uuid_generate_v4() NOT NULL,
name character varying(32) NOT NULL,
);
Co w tym złego?
postgresql
amazon-web-services
amazon-ec2
ア レ ッ ク ス
źródło
źródło
Odpowiedzi:
Rozszerzenie jest dostępne, ale nie zostało zainstalowane w tej bazie danych.
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
źródło
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
\c <db name>
w konsoli pgsqlJeśli rozszerzenie już istnieje, ale nie widzisz funkcji uuid_generate_v4 () podczas wykonywania polecenia opisuj funkcje \ df, wszystko, co musisz zrobić, to upuścić rozszerzenie i dodać je ponownie, aby funkcje również zostały dodane. Oto replikacja problemu:
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)
Prawdopodobnie zdarzyło się, że rozszerzenie zostało pierwotnie dodane do klastra w pewnym momencie w przeszłości, a następnie prawdopodobnie utworzono później nową bazę danych w tym klastrze. W takim przypadku nowa baza danych będzie „świadoma” tylko rozszerzenia, ale nie będzie miała dodanych funkcji uuid, co ma miejsce po dodaniu rozszerzenia. Dlatego musisz go ponownie dodać.
źródło
Wygląda na to, że rozszerzenie nie jest zainstalowane w określonej bazie danych, której potrzebujesz.
Powinieneś połączyć się z tą konkretną bazą danych za pomocą
Następnie zainstaluj rozszerzenie w tej bazie danych
CREATE EXTENSION "uuid-ossp";
źródło
To zadziałało dla mnie.
create extension IF NOT EXISTS "uuid-ossp" schema pg_catalog version "1.1";
upewnij się, że rozszerzenie powinno znajdować się w pg_catalog, a nie w twoim schemacie ...
źródło
Jeśli zmieniłeś
search_path
, określ publiczny schemat funkcji:źródło
jeśli robisz to z polecenia unixa (oprócz PGAdmin), nie zapomnij przekazać DB jako parametru. w przeciwnym razie to rozszerzenie nie zostanie włączone podczas wykonywania żądań w tej bazie danych
psql -d -c "create EXTENSION pgcrypto;"
źródło
# 1 Zainstaluj ponownie rozszerzenie uuid-ossp w dokładnym schemacie:
SET search_path TO public; DROP EXTENSION IF EXISTS "uuid-ossp"; CREATE EXTENSION "uuid-ossp" SCHEMA public;
Jeśli jest to nowa instalacja, możesz pominąć
SET
iDROP
. Kredyty dla @atomCode ( szczegóły )Następnie powinieneś zobaczyć funkcję uuid_generate_v4 () w prawym schemacie (podczas wykonywania
\df
zapytania w linii poleceń psql ) .# 2 Użyj w pełni kwalifikowanych nazw (z
schemaname.
kwalifikatorem):CREATE TABLE public.my_table ( id uuid DEFAULT public.uuid_generate_v4() NOT NULL,
źródło