我正在尝试将我的单元测试从 H2 迁移到 Postgresql。
目前,H2 为我提供了一个内存模式,这样每个连接都映射到一个唯一的模式、创建表、运行测试并删除模式。架构创建和销毁由 H2 自动处理。
单元测试同时运行。
在 Postgresql 中执行此操作的最佳方法是什么?具体来说,
- 如何获得每个连接的唯一架构?
- 测试框架应该生成唯一名称还是有内置机制来执行此操作?
- 如何确保删除连接时删除架构?
- 当单元测试被杀死时,我不想以悬空模式结束。
- 什么方法会产生最高的性能?
- 我需要每秒创建/删除数十个模式。
更新:我在这里找到了一个相关的答案,但如果运行单元测试的进程被杀死,它无法删除模式。
pg_temp
是当前会话的临时模式的别名。如果您
SET search_path TO pg_temp
在运行测试之前执行 a ,它应该都可以正常工作(只要没有明确引用模式)。如果您根本不想更改脚本,请
search_path
在测试登录的用户上设置:除非明确指定,否则用户创建的所有内容都将在 pg_temp 中。
这是来自 的示例
psql
,显示了别名解析为的实际模式(对于此连接):而且,正如您所料,该架构对于每个并发连接都是不同的,并且在连接关闭后就消失了。
请注意,这也适用于函数,尽管您在调用它们时必须显式引用 pg_temp 模式。
您可以获得当前临时架构的名称(在创建第一个临时表之后),如您添加的链接中所示:
但是你目前的计划仍然没有多大意义。要在当前临时模式中创建表,只需创建临时表。就这样。默认情况下,
search_path
定义为使临时表首先可见。永远不需要模式限定临时表。您永远不必以任何方式直接处理当前的临时模式——这是一个实现细节。您的测试是否涉及交易?DDL 在 PostgreSQL 中是事务性的,因此如果您创建架构和表,然后运行测试,所有这些都在一个随后回滚的单个事务中,该架构永远不会真正提交并且对其他会话可见。
您仍然需要为您的架构使用可能唯一的名称(可能包括主机名和 PID),
CREATE SCHEMA
如果已经存在同名架构,则会立即失败,并且如果另一个会话在未提交的事务。如果您能够修改数据库创建脚本来执行此操作,则另一种方法可能只是使用临时表。
我刚刚有了一个想法。
Postgresql 保证一个会话看不到另一个会话的临时表。我猜这意味着当你创建一个临时表时,它会创建一个临时模式。所以也许我可以做以下事情:
我不喜欢依赖实现细节,但在这种情况下,这似乎很安全。