内存中的 Postgres 用于节点运行时的 CI/CD 目的

问题描述 投票:0回答:1

我正在寻找一种解决方案,能够启动类似 postgres 的解决方案,该解决方案仅在内存中运行,以便能够在管道中运行完整的 e2e 测试。我知道有多种方法可以启动临时数据库并连接到该数据库,但我喜欢 https://github.com/nodkz/mongodb-memory-server 对于 mongodb 而对于 postgres 的想法。

我无法想象流行且经常使用的数据库没有轻量级内存数据库替代品

我尝试在下面的存储库中使用 pg-mem,但它无法按预期工作https://github.com/rkristelijn/pg-mem-server。请参阅自述文件以获取更多信息。

database postgresql testing cicd in-memory-database
1个回答
0
投票

我认为 PostgreSQL 没有内存选项。 (看起来pg-mem并没有完全支持所有的PostgreSQL语法。在内存中完全重新实现PostgreSQL语言和引擎确实是一项雄心勃勃的任务。)

有几个选项,例如:

虚拟磁盘

您可以在 Linux 上使用 tmpfs

ramfs
(前者可以使用“交换”内存)在
ramdisk
分区上初始化集群。

这可能是最干净的选项,但在设置方面可能会带来一些开销,甚至在内存中也是如此。

测试用户架构

另一个选择是保留相同的数据库,然后删除并重新创建以您要连接的用户命名的架构(假设使用默认搜索路径)。这假设您没有在查询中指定架构。

如果您的测试用户名为

testuser

,您可以在运行每个测试之前删除并创建一个也称为 
testuser
 的架构:

DROP SCHEMA IF EXISTS testuser CASCADE; CREATE SCHEMA testuser;
然后,如果您始终连接为 

testuser

 进行这些测试(请注意不要连接为其他任何内容,以便您不会将任何内容放入 
public
 模式中),这些查询(没有模式名称)将使用 
testuser
 架构(并在下次删除该架构时被擦除,如上所述):

CREATE TABLE mytable (id SERIAL PRIMARY KEY, column_a TEXT); -- Effectively testuser.mytable, instead of public.mytable by default INSERT INTO mytable(column_a) VALUES ('A'); SELECT id, column_a FROM mytable; -- ...
只要您不在应用程序中指定架构,这应该可以很好地工作。

根据您的应用程序的用途,您实际上可以使用架构(也可能使用公共架构或其他搜索路径),并拥有一些现成可用的数据,当您删除

testuser

 架构时,这些数据不会被擦除。这非常依赖于应用程序。

© www.soinside.com 2019 - 2024. All rights reserved.