Розширення існує, але uuid_generate_v4 не вдається


95

На 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
У майбутньому, будь ласка, завжди показуйте точний текст будь-якого повідомлення про помилку.
Крейг Рінгер,

Відповіді:


195

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

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

17
Команда повинна бутиCREATE EXTENSION IF NOT EXISTS "uuid-ossp";
човновий кодер

7
Щоб було зрозуміло, для вибору db можна писати \c <db name>на консолі pgsql
ElementalStorm

@CraigRinger Де я можу знайти цей документ?
Абхішек Мані

24

Якщо розширення вже є, але ви не бачите функції uuid_generate_v4 (), коли ви виконуєте команду opis 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, що відбувається при додаванні розширення. Тому ви повинні повторно додати його.


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;"


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,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.