opentable встроенный postgresql не работает

Я впервые использую otj-pg-внедрено и хотел бы включить его в нашу тестовую среду. Детали заключаются в следующем

Ниже приведена зависимость 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 в строке 1 кода.

Трассировка стека:

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)

Есть что-то, что мне не хватает, чтобы настроить здесь? Любая помощь будет оценена.

3 ответа

Посмотрев на эту строку в трассировке стекаinitdb: invalid locale settings; check LANG and LC_* environment variables,

Кажется, вам нужно установить переменные env для локали, как описано здесь: https://github.com/zonkyio/embedded-postgres/issues/11.

export LC_CTYPE="en_US.UTF-8"
export LC_ALL="en_US.UTF-8"
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;");

У меня была такая же проблема, и я решил ее, обновив до последней версии otj-pg-embedded.

например, в наборе градиентов:

      testImplementation "com.opentable.components:otj-pg-embedded:1.0.0"

Инициализация базы данных столкнулась с множеством проблем с двоичными файлами, и, наконец, в конце этого длинного закомментированного билета внезапно произошел сбой на OSX. · Issue #136 · opentable/otj-pg-embedded , я нашел реальное решение.

В январе 2022 года библиотека перешла на версию 1, в которой удобно использовать Testcontainers. Это, наконец, решило мои проблемы, и я не стал смотреть на это глубже. Насколько я понимаю, многие проблемы совместимости между самой библиотекой, Postgres и ОС должны были исчезнуть благодаря использованию изолированных контейнеров.

Другие вопросы по тегам