每个连接的临时架构?

Gil*_*ili 8 postgresql unit-test

我正在尝试将我的单元测试从 H2 迁移到 Postgresql。

目前,H2 为我提供了一个内存模式,这样每个连接都映射到一个唯一的模式、创建表、运行测试并删除模式。模式创建和销毁由 H2 自动处理。

单元测试同时运行。

在 Postgresql 中执行此操作的最佳方法是什么?具体来说,

  1. 如何获得每个连接的唯一架构?
    • 测试框架应该生成唯一的名称还是有一个内置的机制来做到这一点?
  2. 如何确保在断开连接时删除架构?
    • 当单元测试被终止时,我不想以悬空模式结束。
  3. 什么方法会产生最高的性能?
    • 我需要每秒创建/删除数十个模式。

更新:我在这里找到了一个相关的答案但它无法删除模式,以防运行单元测试的进程被杀死。

hbn*_*hbn 15

pg_temp 是当前会话的临时模式的别名。

如果您SET search_path TO pg_temp在运行测试之前执行 a ,它应该都可以正常工作(只要没有明确引用架构)。

如果您根本不想更改脚本,则将search_path测试登录的用户设置为:

> ALTER ROLE testuser SET search_path = pg_temp;
Run Code Online (Sandbox Code Playgroud)

除非明确指定,否则用户创建的所有内容都将在 pg_temp 中。

这是来自 的示例psql,显示了别名解析为的实际模式(对于此连接):

> SET search_path TO pg_temp;
SET
> create table test();
CREATE TABLE
> \dt test
          List of relations
  Schema   | Name | Type  |  Owner
-----------+------+-------+----------
 pg_temp_4 | test | table | postgres
(1 row)
Run Code Online (Sandbox Code Playgroud)

而且,正如您所期望的那样,每个并发连接的模式都不同,并且在连接关闭后就消失了。

请注意,这也适用于函数,尽管在调用它们时您必须显式引用 pg_temp 模式。


Erw*_*ter 5

可以获取当前临时架构的名称(创建第一个临时表后),如您添加的链接中所示:

SELECT nspname
FROM   pg_namespace
WHERE  oid = pg_my_temp_schema();
Run Code Online (Sandbox Code Playgroud)

但你目前的计划仍然没有多大意义。要在当前临时模式中创建表,只需创建临时表即可。就这样。默认情况下,search_path定义临时表首先可见。人们永远不需要对临时表进行模式限定。您不必以任何方式直接处理当前的临时模式 -这是一个实现细节。