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 |
url | jdbc: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.InetAddress 和 io.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
我们可以使用 @DbMap 将 Map<String,String>
属性映射到 Postgres HSTORE 类型。
Postgres ANY
Postgres 有一个 ANY
运算符,允许绑定一个值数组。当使用 = ANY(?)
而不是通常的 IN (?,?,? ...)
时,当 IN 子句的绑定值数量可变时,这可以提供非常大的好处。实际上,无论 Postgres = ANY
的绑定值数量如何,我们都可以使用完全相同的 SQL。这意味着我们只需要使用一个 Ebean 查询计划、一个 JDBC PreparedStatement,并且数据库服务器也只看到一个 SQL 语句,并且通常意味着它只需要解析一次以确定查询计划(“数据库需要进行更少的硬解析”)。
由于这些原因,Ebean 将尽可能使用 Postgres = ANY
,而不是使用 IN
子句。
此外,您通常希望在 DtoQuery 和 SqlQuery 的 SQL 语句中使用 = ANY
。
历史支持
Postgres 的历史支持通过生成触发器和历史表来提供。
表分区
Postgres 10 添加了对表分区的支持。我们使用 @DbPartition
定义表应基于 DAY、WEEK、MONTH 或 YEAR 进行范围分区。
@DbPartition(mode = DAY, property = "eventTime")
@Entity
@Table(name = "event")
public class DEvent extends BaseDomain {
...
扩展
我们可能希望使用 hstore
和 pgcrypto
等扩展。请注意,在将 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 文档。