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

94

В 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
В будущем, пожалуйста, всегда показывайте точный текст любого сообщения об ошибке.
Craig Ringer

Ответы:

193

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

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
Крэйг Рингер
источник
17
Команда должна бытьCREATE EXTENSION IF NOT EXISTS "uuid-ossp";
boatcoder 07
7
Для ясности: чтобы выбрать db, можно написать \c <db name>в консоли pgsql
ElementalStorm
@CraigRinger Где я могу найти этот документ?
Abhishek Mani,
23

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

atomCode
источник
17

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

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

 \CONNECT my_database

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

 CREATE EXTENSION "uuid-ossp";
Олалекан Согунле
источник
4

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

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

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

Мигель Бесерра
источник
1

Если вы изменили search_path, укажите общедоступную схему функции:

public.uuid_generate_v4()
Бо Баркер
источник
0

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

psql -d -c "создать РАСШИРЕНИЕ pgcrypto;"

odin38
источник
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 () в правой схеме (при выполнении \dfзапроса в командной строке psql ) .

# 2 Используйте полностью определенные имена (с schemaname.квалификатором):

CREATE TABLE public.my_table (
    id uuid DEFAULT public.uuid_generate_v4() NOT NULL,
эпоксидная смола
источник