我有一些通过 JDBC 与 postgres 数据库交互的代码。但是,出于测试目的,我只想快速创建一个新数据库并连接到它,而无需修改我的全局 postgres 安装、管理用户等。人们通常如何进行这种测试?
4 回答
我会找到initdb
可执行文件并使用它来创建一个可由当前用户写入的新数据库实例临时存储。因为它是一个测试实例,所以使用类似initdb --auth=trust --username=postgres -D /path/to/temp/datadir
这样的东西,新数据库被设置为接受连接而不需要密码。
用于pg_ctl
启动服务器,指定一个端口以覆盖生成的默认设置postgresql.conf
并避免冲突。
连接到新的数据库集群并执行所需的任何工作。在将控制权交给测试代码之前,您需要先以用户身份连接postgres
并运行任何必需CREATE USER
的命令。CREATE DATABASE
最后,使用pg_ctl
停止它,最后删除数据目录。
您所需要的只是initdb
和pg_ctl
,PATH
以及一个管理服务器的辅助类。
看:
有几个库可以轻松创建 Postgres 的临时实例以进行测试:
- http://github.com/tk0miya/testing.postgresql
- http://github.com/TJC/Test-postgresql
- http://eradman.com/ephemeralpg
所有这些都被设计为自动关闭和删除临时数据库。这是您可以用来pg_tmp(1)
从 Java 创建最小 Postgres 实例的方法:
import java.io.*;
import java.sql.*;
public class test_pg
{
public static void main(String args[])
{
try {
Process p = Runtime.getRuntime().exec("pg_tmp -t");
BufferedReader input = new BufferedReader
(new InputStreamReader(p.getInputStream()));
String pg_uri = "jdbc:" + input.readLine();
input.close();
System.out.println("Using " + pg_uri);
Connection conn = DriverManager.getConnection(pg_uri);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select now()");
while(rs.next()) {
System.out.print(rs.getString(1));
}
} catch(IOException | SQLException e) {
e.printStackTrace();
}
}
}
您可以在您的主目录中安装 Postgres 实例,在不同的端口和您的用户下运行。例如,请参见此处:
http://www.bacula.org/manuals/en/catalog/catalog/Installi_Configur_PostgreS.html
你也可以在 Heroku 上测试你的代码,这取决于它是什么。他们免费为您提供一个小型虚拟 Postgres 数据库。
虚拟机
您可以提前配置安装了Postgres的操作系统(例如BSD、Linux等)。将此模板用作要作为虚拟机启动的映像。
您可以使用Parallels、Fusion或VirtualBox等桌面虚拟化在本地执行此操作。
或者您可以在DigitalOcean.com等 VM 服务中执行此操作。
数据库迁移工具
VM 启动并运行后(可能需要一分钟),然后使用数据库迁移工具(例如Flyway或Liquibase)安装架构、表、列和数据。
这些工具可以清除您的内容数据库以供重复使用。有一个设置可确保此功能不能在生产中使用(!)。
请注意,这些工具可以自动创建数据库中的所有内容,但不能执行CREATE DATABASE
. 为此,您需要编写一些其他脚本,或者已经创建了一个空的测试数据库。而且,正如我所说,您可以清除数据库以供重用。