Postgres

Postgres Dockerテストコンテナに対してテストを行うには、`src/test/resources/application-test.yaml` の `platform` を `postgres` に設定します。

`application-test.yaml` がまだ存在しない場合は、ドキュメント / テストを参照してください。

ebean:
  test:
    platform: postgres # h2, postgres, ...
    ddlMode: dropCreate # none | dropCreate | migrations | create
    dbName: my_app

これだけで設定は完了です。IDE、Maven、またはGradleを介してテストを実行すると、データベースとユーザーの作成などを含め、Postgres用のDockerテストコンテナが自動的に設定されます。

上記は、以下のデフォルト値を使用します。

ユーザー名{dbName}
パスワードtest
ポート6432
URLjdbc:postgresql://:{port}/{dbName}
イメージpostgres:{version:12}

ebean-postgres 依存関係

Postgres 特有のプラットフォームコードのみを取り込みたい場合は、`io.ebean:ebean` の代わりに `io.ebean:ebean-postgres` 依存関係を使用できます。 `io.ebean:ebean` に依存すると、すべてのプラットフォームが取り込まれます。

Postgres の型

UUID

UUID は、ネイティブの Postgres UUID 型にマッピングされます。

INET

`java.net.InetAddress` と `io.ebean.types.Inet` はどちらも、ネイティブの Postgres INET 型に自動的にマッピングされます。 InetAddress を使用する場合、アドレスを検証する際に不要な DNS ルックアップを実行しないように注意する必要があります。 `io.ebean.types.Inet` は単純な値型です。

配列型 - @DbArray

@DbArray を使用して、UUID、String、Enum、Number 型のリストまたはセットをマッピングします。これらは、`uuid[]`、`varchar[]`、`integer[]` などの Postgres 配列型にマッピングされます。

Postgres 配列型の詳細については、こちらをご覧ください。

JSON / JSONB - @DbJson

@DbJson@DbJsonB を使用して、コンテンツを Postgres JSON または JSONB 型にマッピングできます。

HSTORE - @DbMap

@DbMap を使用して、`Map<String,String>` プロパティを Postgres HSTORE 型にマッピングできます。

Postgres ANY

Postgres には、値の配列をバインドできる `ANY` 演算子があります。これは、`IN (?,?,? ...)` の代わりに `= ANY(?)` を使用する場合、`IN` 句のバインド値の数が可変である場合に非常に大きな利点があります。事実上、Postgres `= ANY` ではバインド値の数に関係なく、まったく同じ SQL を使用できます。つまり、Ebean クエリプランと JDBC PreparedStatement を 1 つだけ使用すればよく、データベースサーバーも 1 つの SQL ステートメントのみを参照するため、通常はクエリプランを決定するために 1 回だけ解析すれば済みます(「データベースのハードパースの負荷が軽減される」)。

これらの理由から、Ebean は `IN` 句ではなく、可能な限り Postgres `= ANY` を使用します。

さらに、DtoQuerySqlQuery の SQL ステートメントで `= ANY` を使用したい場合がよくあります。

履歴サポート

Postgres の履歴サポートは、トリガーと履歴テーブルを生成することによって提供されます。

テーブルパーティショニング

Postgres 10 は、テーブルパーティショニングのサポートを追加しました。 `@DbPartition` を使用して、テーブルが日、週、月、または年 based on に基づいてレンジパーティショニングを持つように定義します。

@DbPartition(mode = DAY, property = "eventTime")
@Entity
@Table(name = "event")
public class DEvent extends BaseDomain {
  ...

拡張機能

`hstore` や `pgcrypto` などの拡張機能を使用する場合があります。ebean-test を Docker で使用する場合、これらの 2 つの拡張機能はデフォルトで自動的に追加されます。

自動的にインストールする必要がある拡張機能は、以下のように指定できます。

ebean:
  test:
    platform: postgres #, h2, postgres, mysql, oracle, sqlserver
    ddlMode: dropCreate # none | dropCreate | migrations | create
    dbName: myapp
    postgres:
      extensions: pgcrypto, hstore

スキーマ

Postgres では、テーブルを(パブリックスキーマではなく)名前付きスキーマに作成することをお勧めします。 Ebean バージョン 11.18.2 では、`ebean.dbSchema` を指定することで、DB マイグレーションと create-all.sql の両方でこのスキーマが使用されるため、簡単に設定できます。

DB ユーザーが DB スキーマと一致することをお勧めします。一致する場合、`currentSchema` を使用したり、`search path` を変更したりする必要はありません。たとえば、`myapp` というスキーマを使用する場合、DB ユーザー/ロールを `myapp` に一致させることをお勧めします。

application.yaml
ebean:
  dbSchema: myapp  ## use this database schema
DatabaseConfig
databaseConfig.setDbSchema("myapp");

Docker コンテナ

Postgres の Docker コンテナバージョンをプログラムで起動できます。これは、アプリケーションをローカルで実行するのに便利な方法です。

以下では、`ebean-test` に既に含まれている `ebean-test-docker` 依存関係を使用しています。 `ebean-test` に依存していない場合は、依存関係として `io.ebean:ebean-test-docker:5.0` を追加してください。

package main;

import io.ebean.docker.commands.PostgresContainer;

public class StartPostgres {

  public static void main(String[] args) {

    PostgresContainer container = PostgresContainer.newBuilder("14")
      // .port(5432) // Note: defaults to 6432
      .dbName("my_app")
      .user("my_app")
      .password("silly")
      .containerName("pg14x")
      .extensions("hstore,pgcrypto")
      .build();

    container.start();
  }
}

上記は、**ポート 6432** で Postgres 13 Docker コンテナをプログラムで起動します。コンテナ名 `pg13x` でデータベースとユーザーを作成します。コンテナが既に存在する場合は、削除して再作成します。

Docker トレースロギング

`io.ebean.docker` のログレベルを `trace` に設定して、問題のトラブルシューティングを行ったり、ebean-test-docker の動作を理解したりしてください.

PostGIS

PostGIS を使用するには、PostGIS ドキュメントを参照してください。