Tiện ích mở rộng tồn tại nhưng uuid_generate_v4 không thành công


95

Tại 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)

Như bạn có thể thấy, uuid-osspphần mở rộng tồn tại. Tuy nhiên, khi tôi đang gọi hàm để tạo uuid_v4, nó không thành công:

CREATE TABLE my_table (
    id uuid DEFAULT uuid_generate_v4() NOT NULL,
    name character varying(32) NOT NULL,

);

Điều này có gì sai?


5
Trong tương lai, vui lòng luôn hiển thị văn bản chính xác của bất kỳ thông báo lỗi nào.
Craig Ringer,

Câu trả lời:


197

Phần mở rộng có sẵn nhưng không được cài đặt trong cơ sở dữ liệu này.

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

17
Lệnh nên làCREATE EXTENSION IF NOT EXISTS "uuid-ossp";
boatcoder

7
Chỉ cần được rõ ràng, để chọn một db có thể viết \c <db name>trong pgsql console
ElementalStorm

@CraigRinger Tôi có thể tìm tài liệu này ở đâu?
Abhishek Mani

24

Nếu tiện ích mở rộng đã ở đó nhưng bạn không thấy hàm uuid_generate_v4 () khi thực hiện lệnh mô tả các hàm \ df thì tất cả những gì bạn cần làm là thả tiện ích mở rộng và thêm lại nó để các hàm cũng được thêm vào. Đây là bản sao vấn đề:

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)

Điều có thể xảy ra là phần mở rộng ban đầu đã được thêm vào cụm tại một thời điểm nào đó trong quá khứ và sau đó bạn có thể tạo cơ sở dữ liệu mới trong cụm đó sau đó. Nếu đúng như vậy thì cơ sở dữ liệu mới sẽ chỉ "biết" về tiện ích mở rộng nhưng nó sẽ không có các chức năng ưu đãi được thêm vào khi bạn thêm tiện ích mở rộng. Do đó bạn phải thêm lại nó.


17

Có vẻ như tiện ích mở rộng không được cài đặt trong cơ sở dữ liệu cụ thể mà bạn yêu cầu.

Bạn nên kết nối với cơ sở dữ liệu cụ thể này với

 \CONNECT my_database

Sau đó cài đặt tiện ích mở rộng trong cơ sở dữ liệu này

 CREATE EXTENSION "uuid-ossp";

4

Điều này đã làm việc cho tôi.

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

đảm bảo rằng phần mở rộng phải nằm trên pg_catalog chứ không phải trong lược đồ của bạn ...


1

Nếu bạn đã thay đổi search_path, hãy chỉ định lược đồ công khai trên hàm:

public.uuid_generate_v4()

0

nếu bạn làm điều đó từ lệnh unix (ngoài PGAdmin), đừng quên chuyển DB làm tham số. nếu không thì phần mở rộng này sẽ không được bật khi thực hiện các yêu cầu trên DB này

psql -d -c "tạo MỞ RỘNG pgcrypto;"


0

# 1 Cài đặt lại phần mở rộng uuid-ossp trong một lược đồ chính xác:

SET search_path TO public;
DROP EXTENSION IF EXISTS "uuid-ossp";

CREATE EXTENSION "uuid-ossp" SCHEMA public;

Nếu đây là một cài đặt mới, bạn có thể bỏ qua SETDROP. Tín dụng cho @atomCode ( chi tiết )

Sau đó, bạn sẽ thấy hàm uuid_generate_v4 () trong lược đồ bên phải (khi thực hiện \dftruy vấn trong dấu nhắc dòng lệnh psql ) .

# 2 Sử dụng tên đủ điều kiện (có schemaname.đủ điều kiện):

CREATE TABLE public.my_table (
    id uuid DEFAULT public.uuid_generate_v4() NOT NULL,
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.