Подтвердить что ты не робот

Расширение существует, но uuid_generate_v4 не работает

В 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,

);

Что случилось с этим?

4b9b3361

Ответ 1

Расширение доступно, но не установлено в этой базе данных.

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

Ответ 2

Если расширение уже существует, но вы не видите функцию 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, которая возникает, когда вы добавляете расширение. Поэтому вы должны повторно добавить его.

Ответ 3

Похоже, что расширение не установлено в конкретной требуемой вам базе данных.

Вы должны подключиться к этой конкретной базе данных с помощью

 \CONNECT my_database

Затем установите расширение в этой базе данных

 CREATE EXTENSION "uuid-ossp";

Ответ 4

если вы сделаете это из команды unix (кроме PGAdmin), не забудьте передать DB в качестве параметра. в противном случае это расширение не будет включено при выполнении запросов на этом БД

psql -d -c "create EXTENSION pgcrypto;"

Ответ 5

Это сработало для меня.

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

убедитесь, что расширение должно быть в pg_catalog, а не в вашей схеме...