Ответ 1
Расширение доступно, но не установлено в этой базе данных.
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
В 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,
);
Что случилось с этим?
Расширение доступно, но не установлено в этой базе данных.
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
Если расширение уже существует, но вы не видите функцию uuid_generate_v4(), когда вы выполняете описанные функции \df, тогда все, что вам нужно сделать, это удалить расширение и повторно добавить так что функции также добавляются. Вот репликация проблемы:
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, которая возникает, когда вы добавляете расширение. Поэтому вы должны повторно добавить его.
Похоже, что расширение не установлено в конкретной требуемой вам базе данных.
Вы должны подключиться к этой конкретной базе данных с помощью
\CONNECT my_database
Затем установите расширение в этой базе данных
CREATE EXTENSION "uuid-ossp";
если вы сделаете это из команды unix (кроме PGAdmin), не забудьте передать DB в качестве параметра. в противном случае это расширение не будет включено при выполнении запросов на этом БД
psql -d -c "create EXTENSION pgcrypto;"
Это сработало для меня.
create extension IF NOT EXISTS "uuid-ossp" schema pg_catalog version "1.1";
убедитесь, что расширение должно быть в pg_catalog, а не в вашей схеме...