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 и ОС должны были исчезнуть благодаря использованию изолированных контейнеров.