programing

확장이 있지만 uuid_generate_v4가 실패함

instargram 2023. 5. 27. 09:37
반응형

확장이 있지만 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,

);

이거 왜 이래요?

확장을 사용할 수 있지만 이 데이터베이스에 설치되지 않았습니다.

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

확장자가 이미 있지만 함수 설명 \df 명령을 수행할 때 uuid_generate_v4() 함수가 표시되지 않으면 확장자를 삭제하고 함수도 추가되도록 다시 추가하기만 하면 됩니다.문제 복제는 다음과 같습니다.

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 함수는 추가되지 않습니다.따라서 다시 추가해야 합니다.

확장이 필요한 특정 데이터베이스에 설치되지 않은 것 같습니다.

다음을 사용하여 이 특정 데이터베이스에 연결해야 합니다.

 \CONNECT my_database

그런 다음 이 데이터베이스에 확장을 설치합니다.

 CREATE EXTENSION "uuid-ossp";

1단계: uuid-osspention을 정확한 스키마에 다시 설치합니다.

새로 설치한 경우 건너뛸 수 있습니다.SET그리고.DROP@atomCode에 대한 크레딧(상세 정보)

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

CREATE EXTENSION "uuid-ossp" SCHEMA public;

이후 오른쪽 스키마에 uuid_generate_v4() 함수가 표시됩니다(psql 명령줄 프롬프트에서 쿼리를 실행할 때).

2단계: 정규화된 이름 사용(와 함께)schemaname.한정자):

예:

CREATE TABLE public.my_table (
    id uuid DEFAULT public.uuid_generate_v4() NOT NULL,

변경한 경우search_path을 지정합니다.public함수 호출의 스키마:

public.uuid_generate_v4()

이것은 저에게 효과가 있었습니다.

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

확장자가 스키마에 있지 않고 pg_message에 있는지 확인합니다.

스크립트 시작 부분에 이 코드를 추가하기만 하면 됩니다.

DROP EXTENSION IF EXISTS "uuid-ossp";
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

어쩌면 제가 마주하고 있던 것과 같았을지도 모릅니다.uuid_generate_v4에서 왔습니다.public스키마를 사용하여 특정 스키마에서 실행하려고 했기 때문에 수정하기 위해 다음 작업을 수행했습니다.

SET search_path TO specific_schema;

INSERTO INTO my_table VALUES public.uuid_generate_v4();

함수가 실행 중인 스키마를 확인할 수 있습니다.

\df uuid_generate_v4

또는

SELECT n.nspname, p.probin, p.proname
FROM
    pg_proc p
    LEFT JOIN pg_namespace n ON p.pronamespace = n.oid
WHERE p.proname like 'uuid_generate_v4';

다음과 같이 uuid-osp의 확장과 관련된 정보를 확인할 수 있습니다.

SELECT * FROM pg_extension WHERE extname LIKE 'uuid-ossp';

아직 없는 확장 사례를 추가할 수 있습니다.

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

(PGAdmin과는 별도로) unix 명령에서 수행하는 경우 DB를 매개 변수로 전달하는 것을 잊지 마십시오.그렇지 않으면 이 DB에서 요청을 실행할 때 이 확장이 활성화되지 않습니다.

psql -d -c "확장 pgcrypto 생성"

제 경우에는 3단계였습니다.데이터베이스를 만들고 데이터베이스에 연결한 후 확장을 만듭니다.중요한 단계는 두 번째 단계인 "데이터베이스에 연결"이며, ";"가 없는 줄은 SQL 문장이 아닌 명령임을 알 수 있습니다.

CREATE DATABASE database_name_here;
\connect database_name_here 
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

언급URL : https://stackoverflow.com/questions/22446478/extension-exists-but-uuid-generate-v4-fails

반응형