JDBC ile postgres'e bağlanırken şema belirtilebilir mi?


Yanıtlar:


213

Bunun zaten yanıtlandığını biliyorum, ancak aynı sorunla likibase komut satırı için kullanılacak şemayı belirlemeye çalışırken karşılaştım.

JDBC v 9.4'ten itibaren güncelle url'yi yeni currentSchema parametresiyle şu şekilde belirtebilirsiniz:

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

Daha önceki bir yamaya göre görünür:

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

Hangi önerilen url şöyle:

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

2
Evet, ancak şu anda (2012'nin sonları) 9.1 sürücüsünün bir parçası değil , bkz: Bağlantı Parametreleri .
user272735

Onu denedin mi? Çünkü önceki sürücünün bir parçası olarak listelenmemişti ama yine de çalıştı.
Hiro2k

8
9.3-1101-jdbc41 ve 9.1 ile denendi, benim için çalışmıyor
Ignacio A. Poletti

@ IgnacioA.Poletti setSchemaBağlantınızı oluşturduktan sonra JDCB yöntemini kullanmayı deneyin . Yeni bir postgres sürücüsü ile benim için çalışıyor.
beldaz

7
Bu sorunu farklı (daha yeni) bir JDBC sürücüsü kullanarak da çözdük. Bizim durumumuzda postgresql-9.4.1209.jdbc42.jarbir 9.5veritabanı ve ?currentSchema=myschemasözdizimi ile birlikte çalıştı .
SebastianH

67

İtibariyle sürümü 9.4 , kullanabileceğiniz currentSchemabağlantı dizesinde parametresini.

Örneğin:

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

48

Ortamınızda mümkünse, kullanıcının varsayılan şemasını istediğiniz şemaya da ayarlayabilirsiniz:

ALTER USER user_name SET search_path to 'schema'

1
Muhtemelen veritabanının kendisini DEĞİŞTİRMEK daha iyidir, böylece aynı kullanıcı gerekirse farklı arama yollarına sahip farklı veritabanlarına bağlanabilir: ALTER DATABASE dbname SET search_path TO public, schemaname;
Alaska

45

Bağlantı dizesinde şemayı belirtmenin bir yolu olduğuna inanmıyorum. Görünüşe göre yürütmen gerekiyor

set search_path to 'schema'

Şemayı belirtmek için bağlantı yapıldıktan sonra.


2
Bu benim için çalıştı, özellikle çalıştırmak için "Bağlantı" örneğini kullanarak: Statement statement = connection.createStatement(); try { statement.execute("set search_path to '" + schema + "'"); } finally { statement.close(); }
romeara

Bağlantı dizesinde (jdbc uri) varsayılan şemayı belirtmenin bir yolu vardır. Aşağıdaki cevaplara bakın.
protoboolean

8

DataSource - setCurrentSchema

Bir DataSourceuygulama örneğini oluştururken , geçerli / varsayılan şemayı ayarlamak için bir yöntem arayın.

Örneğin, PGSimpleDataSourcesınıf görüşmesinde 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_" );  // <----------

Şemayı belirtmeden bırakırsanız, Postgres varsayılan olarak publicveritabanı içinde adlandırılan bir şemaya ayarlanır . Kılavuza bakın, bölüm 5.9.2 Genel Şema . Şapka kılavuzundan alıntı yapmak için:

Önceki bölümlerde herhangi bir şema adı belirtmeden tablolar oluşturduk. Varsayılan olarak bu tür tablolar (ve diğer nesneler) otomatik olarak "genel" adlı bir şemaya yerleştirilir. Her yeni veritabanı böyle bir şema içerir.


3
" bir şemaya bağlanma girişimleri " - Bu biraz yanıltıcıdır. Sürücü "bir şemaya" değil, bir veritabanına bağlanır . Sorgular tarafından hangi şemanın kullanıldığı,search_path
a_horse_with_no_name


3

SET SCHEMA 'myschema'Ayrı bir İfadede hangisini kullanabileceğinizi unutmayın

ŞEMA AYARLA 'değer', arama_ yolu TO değerini SET için bir takma addır. Bu sözdizimi kullanılarak yalnızca bir şema belirtilebilir.

Ve JDBC sürücüsünün 9.4 ve muhtemelen önceki sürümlerinden beri, setSchema(String schemaName)yöntem için destek vardır .


3

Go with "sql.DB" ( search_pathalt çizgi ile not edin ):

postgres://user:password@host/dbname?sslmode=disable&search_path=schema
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.