我有一些代码通过JDBC与postgres数据库交互。但是,出于测试目的,我只想快速创建一个新数据库并连接到它,而无需修改我的全局postgres安装,管理用户等。人们通常如何进行这种测试?
答案 0 :(得分:7)
我找到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
,以及管理服务器的助手类。
请参阅:
答案 1 :(得分:5)
有几个库可以创建Postgres的临时实例,以便于测试:
所有这些都被设计为关闭并自动删除临时数据库。这是您可以使用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();
}
}
}
答案 2 :(得分:0)
您可以在主目录中安装Postgres实例,在不同的端口和用户下运行。请参见此处:
http://www.bacula.org/manuals/en/catalog/catalog/Installi_Configur_PostgreS.html
你也可以在Heroku上测试你的代码,具体取决于它是什么。他们免费为您提供一个小型虚拟Postgres数据库。
答案 3 :(得分:0)
您可以提前配置安装了OS的BSD(例如Linux,Postgres等)。将此模板用作要作为虚拟机启动的映像。
您可以使用Parallels,Fusion或VirtualBox之类的桌面虚拟化在本地执行此操作。
或者您可以在VM服务(例如DigitalOcean.com)中完成此操作。
一旦虚拟机启动并运行(可能需要一分钟),然后使用database migration或Flyway之类的Liquibase工具来安装架构,表,列和数据。
这些工具可以clear your database的内容重复使用。有一个设置可以确保不能在生产环境中使用此功能(!)。
请注意,这些工具可以自动创建数据库 中的所有内容,但不能执行CREATE DATABASE
。为此,您将需要执行其他一些脚本编写,或者已经创建了一个空的测试数据库。而且,正如我所说,您可以清除数据库以供重用。