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://localhost:{port}/{dbName}
镜像postgres:{version:12}

ebean-postgres 依赖项

如果我们只想引入特定于 Postgres 的平台代码,我们可以使用 io.ebean:ebean-postgres 依赖项,而不是 io.ebean:ebean。依赖于 io.ebean:ebean 将引入所有平台。

Postgres 类型

UUID

UUID 映射到本机 Postgres UUID 类型。

INET

java.net.InetAddressio.ebean.types.Inet 都自动映射到本机 Postgres INET 类型。在使用 InetAddress 时,我们需要小心,不要执行不必要的 DNS 查找来验证地址。io.ebean.types.Inet 是一个简单值类型。

数组类型 - @DbArray

我们使用 @DbArray 映射 UUID、String、Enums、Number 类型的列表或集合。这些映射到 Postgres 数组类型,如 uuid[], varchar[], integer[] ...

有关 Postgres 数组类型 的更多信息。

JSON / JSONB - @DbJson

我们可以使用 @DbJson@DbJsonB 将内容映射到 Postgres JSON 或 JSONB 类型。

HSTORE - @DbMap

我们可以使用 @DbMapMap<String,String> 属性映射到 Postgres HSTORE 类型。

Postgres ANY

Postgres 有一个 ANY 运算符,允许绑定一个值数组。当使用 = ANY(?) 而不是通常的 IN (?,?,? ...) 时,当 IN 子句的绑定值数量可变时,这可以提供非常大的好处。实际上,无论 Postgres = ANY 的绑定值数量如何,我们都可以使用完全相同的 SQL。这意味着我们只需要使用一个 Ebean 查询计划、一个 JDBC PreparedStatement,并且数据库服务器也只看到一个 SQL 语句,并且通常意味着它只需要解析一次以确定查询计划(“数据库需要进行更少的硬解析”)。

由于这些原因,Ebean 将尽可能使用 Postgres = ANY,而不是使用 IN 子句。

此外,您通常希望在 DtoQuerySqlQuery 的 SQL 语句中使用 = ANY

历史支持

Postgres 的历史支持通过生成触发器和历史表来提供。

表分区

Postgres 10 添加了对表分区的支持。我们使用 @DbPartition 定义表应基于 DAY、WEEK、MONTH 或 YEAR 进行范围分区。

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

扩展

我们可能希望使用 hstorepgcrypto 等扩展。请注意,在将 ebean-test 与 docker 一起使用时,它将默认自动添加这两个扩展。

我们可以通过以下方式指定应自动安装的扩展

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-docker 依赖项,它已经包含在 ebean-test 中。如果我们没有依赖 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 文档