JDBC로 postgres에 연결할 때 스키마를 지정할 수 있습니까?


답변:


204

나는 이것이 이미 답변되었다는 것을 알고 있지만 liquibase 명령 줄에 사용할 스키마를 지정하려고하는 것과 동일한 문제가 발생했습니다.

업데이트 JDBC V의로 9.4 그렇게 같은 새로운 currentSchema 매개 변수를 사용하여 URL을 지정할 수 있습니다 :

jdbc:postgresql://localhost:5432/mydatabase?currentSchema=myschema

이전 패치를 기반으로 나타납니다.

http://web.archive.org/web/20141025044151/http://postgresql.1045698.n5.nabble.com/Patch-to-allow-setting-schema-search-path-in-the-connectionURL-td2174512. html

제안 된 URL은 다음과 같습니다.

jdbc:postgresql://localhost:5432/mydatabase?searchpath=myschema

2
예. 그러나 글을 쓰는 시점 (2012 년 말)에는 9.1 드라이버 의 일부가 아닙니다 . 연결 매개 변수를 참조하십시오 .
user272735

해봤 어? 이전 드라이버의 일부로 표시되지 않았지만 여전히 작동했기 때문입니다.
Hiro2k

8
9.3-1101-jdbc41 및 9.1로 시도했지만 작동하지 않습니다.
Ignacio A. Poletti

@ IgnacioA.Poletti setSchema연결을 만든 후 JDCB 방법을 사용해보십시오 . 최근 postgres 드라이버와 함께 작동합니다.
beldaz 2016 년

7
우리는 다른 (새로운) JDBC 드라이버를 사용하여이 문제를 해결했습니다. 이 경우 데이터베이스 및 구문 과 postgresql-9.4.1209.jdbc42.jar함께 작동했습니다 . 9.5?currentSchema=myschema
SebastianH

63

현재 버전 9.4 , 당신은 사용할 수있는 currentSchema연결 문자열에서 매개 변수를.

예를 들면 다음과 같습니다.

jdbc:postgresql://localhost:5432/mydatabase?currentSchema=myschema

48

환경에서 가능하면 사용자의 기본 스키마를 원하는 스키마로 설정할 수도 있습니다.

ALTER USER user_name SET search_path to 'schema'

1
필요한 경우 동일한 사용자가 다른 search_path를 사용하여 다른 데이터베이스에 연결할 수 있도록 데이터베이스 자체를 변경하는 것이 좋습니다. ALTER DATABASE dbname SET search_path TO public, schemaname;
알래스카

44

연결 문자열에 스키마를 지정하는 방법이 없다고 생각합니다. 실행 해야하는 것 같습니다.

set search_path to 'schema'

연결 후 스키마를 지정합니다.


2
이것은 특히 "연결"인스턴스를 사용하여 다음과 같이 작동했습니다. Statement statement = connection.createStatement(); try { statement.execute("set search_path to '" + schema + "'"); } finally { statement.close(); }
romeara

연결 문자열 (jdbc uri)에 기본 스키마를 지정하는 방법이 있습니다. 아래 답변을 참조하십시오.
basilikode


7

DataSourcesetCurrentSchema

인스턴스화 할 때 DataSource구현을 현재 / 기본 스키마를 설정하는 메소드를 찾으십시오.

예를 들어, PGSimpleDataSource수업 중setCurrentSchema .

org.postgresql.ds.PGSimpleDataSource dataSource = new org.postgresql.ds.PGSimpleDataSource ( );
dataSource.setServerName ( "localhost" );
dataSource.setDatabaseName ( "your_db_here_" );
dataSource.setPortNumber ( 5432 );
dataSource.setUser ( "postgres" );
dataSource.setPassword ( "your_password_here" );
dataSource.setCurrentSchema ( "your_schema_name_here_" );  // <----------

스키마를 지정하지 않으면 Postgres는 기본적으로 public데이터베이스 내에 명명 된 스키마를 사용 합니다. 매뉴얼, 섹션 5.9.2 참조 공개 스키마를. 모자 매뉴얼을 인용하려면 :

이전 섹션에서는 스키마 이름을 지정하지 않고 테이블을 만들었습니다. 기본적으로 이러한 테이블 (및 기타 개체)은 "public"이라는 스키마에 자동으로 저장됩니다. 모든 새 데이터베이스에는 이러한 스키마가 포함됩니다.


3
" 스키마에 연결을 시도합니다 "-약간 오해의 소지가 있습니다. 드라이버는 "스키마"가 아니라 데이터베이스에 연결 됩니다. 쿼리에서 사용되는 스키마는 현재의 설정에 따라 달라집니다search_path
a_horse_with_no_name

3

SET SCHEMA 'myschema'별도의 명세서에서 사용할 수있는 것을 잊지 마십시오

SET SCHEMA 'value'는 SET search_path TO 값의 별명입니다. 이 구문을 사용하여 하나의 스키마 만 지정할 수 있습니다.

그리고 JDBC 드라이버의 9.4 및 이전 버전부터 setSchema(String schemaName)메소드를 지원합니다 .


3

"sql.DB"로 이동 ( search_path밑줄로 밑줄 표시) :

postgres://user:password@host/dbname?sslmode=disable&search_path=schema

0

이것은 이미 답변되었습니다 :

jdbc : postgresql : // localhost : 5432 / mydatabase? currentSchema = myschema

이전 답변과 마찬가지로 위의 연결 문자열이 작동합니다.

확인했는데 괜찮습니다 : https://youtu.be/m0lBUHSLkNM?t=79

(응답은 8 년 전에 제공되었지만 1 년 전에 편집되었습니다.)


1
8 년 전의 답변과 어떻게 다릅니 까?
stdunbar

글쎄, 의견에는 그것이 작동하지 않을 수도 있다는 의혹을 제기 한 게시물도 있었다. . 따라서 테스트를했고 테스트를 비디오로 게시했습니다 (나는 새로운 회원이며 다른 사람의 답변에 대해서는 아직 언급 할 수 없습니다). -또한 수락 된 답변은 8 년 전에 제공되었지만 1 년 전에 편집되었습니다. . .
AlexSandu75
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.