opentable嵌入式PostgreSQL无法正常工作

时间:2018-12-14 08:15:34

标签: java postgresql in-memory-database

我第一次使用otj-pg-embedded,并希望将其合并到我们的测试框架中。详细信息如下

以下是Maven依赖项:

 <dependency>
            <groupId>com.opentable.components</groupId>
            <artifactId>otj-pg-embedded</artifactId>
            <version>0.12.5</version>
            <scope>test</scope>
 </dependency>

代码是:

EmbeddedPostgres pg = EmbeddedPostgres.start();
 Connection connection = pg.getPostgresDatabase().getConnection();
 Statement s = connection.createStatement();
 ResultSet rs = s.executeQuery("SELECT 1");
 assertEquals(1, rs.getInt(1));

但是它失败,并在代码的第一行出现java.lang.IllegalStateException。

堆栈跟踪为:

initdb: invalid locale settings; check LANG and LC_* environment variables

java.lang.IllegalStateException: Process [/var/folders/rj/3jd5_2n16g37lv1v550g9cqw0000gp/T/embedded-pg/PG-b210101549c90a94dbbada389b65c5d2/bin/initdb, -A, trust, -U, postgres, -D, /var/folders/rj/3jd5_2n16g37lv1v550g9cqw0000gp/T/epg2729813194709143982, -E, UTF-8] failed


        at com.opentable.db.postgres.embedded.EmbeddedPostgres.system(EmbeddedPostgres.java:593)
        at com.opentable.db.postgres.embedded.EmbeddedPostgres.initdb(EmbeddedPostgres.java:230)
        at com.opentable.db.postgres.embedded.EmbeddedPostgres.<init>(EmbeddedPostgres.java:148)
        at com.opentable.db.postgres.embedded.EmbeddedPostgres$Builder.start(EmbeddedPostgres.java:580)
        at com.opentable.db.postgres.embedded.EmbeddedPostgres.start(EmbeddedPostgres.java:480)

我在这里配置缺少什么吗?任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

通过查看堆栈跟踪中的这一行 initdb: invalid locale settings; check LANG and LC_* environment variables

似乎您需要按照以下说明为区域设置环境变量:https://github.com/zonkyio/embedded-postgres/issues/11

export LC_CTYPE="en_US.UTF-8"
export LC_ALL="en_US.UTF-8"

答案 1 :(得分:0)

EmbeddedPostgres pg = EmbeddedPostgres.builder().start();

//Get the connection to postgres db
Statement dbSetup = pg.getDatabase("postgres", "postgres").getConnection().createStatement();

//Then create a db as per your requirement with appropriate user and password if required.
dbSetup.execute("create database testdatabase;");
dbSetup.execute("CREATE USER testadmin WITH PASSWORD 'testadmin' CREATEDB;");
dbSetup.execute("ALTER USER testadmin WITH SUPERUSER;"); 
dbSetup.execute("ALTER ROLE testadmin SUPERUSER;");

// Connect to the created database and work
pg.getDatabase("testadmin", "testdatabase").getConnection().createStatement().executeQuery("select 1;");