มีส่วนขยายอยู่ แต่ 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
ในอนาคตโปรดแสดงข้อความแสดงข้อผิดพลาดที่ตรงกันทุกครั้ง
Craig Ringer

คำตอบ:


195

ส่วนขยายพร้อมใช้งานแต่ไม่ได้ติดตั้งในฐานข้อมูลนี้

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

17
คำสั่งควรเป็นCREATE EXTENSION IF NOT EXISTS "uuid-ossp";
boatcoder

7
เพื่อความชัดเจนในการเลือกฐานข้อมูลที่สามารถเขียน\c <db name>ในคอนโซล pgsql
ElementalStorm

@CraigRinger ฉันจะหาเอกสารนี้ได้ที่ไหน
Abhishek Mani

24

หากมีส่วนขยายอยู่แล้ว แต่คุณไม่เห็นฟังก์ชัน 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 เพิ่มเข้ามาซึ่งจะเกิดขึ้นเมื่อคุณเพิ่มส่วนขยาย ดังนั้นคุณต้องเพิ่มใหม่


17

ดูเหมือนว่าส่วนขยายไม่ได้ติดตั้งในฐานข้อมูลเฉพาะที่คุณต้องการ

คุณควรเชื่อมต่อกับฐานข้อมูลนี้ด้วย

 \CONNECT my_database

จากนั้นติดตั้งส่วนขยายในฐานข้อมูลนี้

 CREATE EXTENSION "uuid-ossp";

4

สิ่งนี้ได้ผลสำหรับฉัน

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

ตรวจสอบให้แน่ใจว่าส่วนขยายควรอยู่ใน pg_catalog ไม่ใช่ในสคีมาของคุณ ...



0

หากคุณทำจากคำสั่ง unix (นอกเหนือจาก PGAdmin) อย่าลืมส่ง DB เป็นพารามิเตอร์ มิฉะนั้นส่วนขยายนี้จะไม่ถูกเปิดใช้งานเมื่อดำเนินการร้องขอบนฐานข้อมูลนี้

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,
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.