Отношение «schema.table» не существует исключение, генерируемое при использовании slick 3.3.3

#postgresql #scala #sbt #slick #typesafe

#postgresql #scala #sbt #slick #typesafe

Вопрос:

Проблема: итак, я пытаюсь подключиться к базе данных PostgreSQL с помощью scala slick v3.3.3, и не удается найти пользователей отношения (таблицы) в схеме «один» в базе данных «onetest».

У меня есть следующая настройка таблицы:

 CREATE SCHEMA one;
CREATE TABLE one.users (
...
);
 

и определение таблицы:

 class UsersTable(tag: Tag) extends Table[UserRequest](tag, Some("one"), "users") {
...
}
 

с конфигурацией базы данных:

 onedbtest = {
  profile = "slick.jdbc.PostgresProfile$"
  db = {
    dataSourceClass = "org.postgresql.ds.PGSimpleDataSource" //Simple datasource with no connection pooling. The connection pool has already been specified with HikariCP.
    driver = "slick.driver.PostgresDriver$"
    serverName = "localhost"
    portNumber = "5432"
    databaseName = "onetest"
    user = onetestuser
    password = "password"
    connectionPool = disabled
  }
}
 

и при запуске (с необходимым импортом):
dbConfig.db.run((usersTable = createUserRequest).asTry)

Почему он не может найти отношения (таблицы) в БД?

Примечание: ошибка не появляется (при прохождении тестов), когда: keepAliveConnection = true добавляется в конфигурацию для инициализации БД, однако запись в другую БД с именем «one» (среда разработки) не работает при connectionPool = disabled добавлении. Он должен работать с добавленным атрибутом ConnectionPool, но это не так. Странно, что он ссылается на другую БД, когда БД нигде не определена в коде. Я использую sbt.version = 1.3.13 и scalaVersion := «2.12.6». sbt clean compile и перестройка не решает проблемы с кэшированием. Я также отключил все процессы, чтобы остановить любые открытые соединения и использовать db.close там, где это необходимо.

Комментарии:

1. Я пытался воспроизвести вашу проблему, но безрезультатно. Не похоже, что у slick есть проблемы с пользовательскими схемами. Вместо ошибок в поведении библиотеки, которые вы описываете, указывает на проблемы с конфигурацией в вашем проекте. Нет никакого способа, которым slick может получить базу данных, которую вы не настроили сами где-нибудь в проекте. Причиной такого поведения могло быть несколько конфигурационных файлов, которые были собраны и объединены недетерминированным образом. github.com/lightbend/config/issues/342

2. @tentacle Спасибо за ваш комментарий, я это исправил. Взгляните на ответ :).

Ответ №1:

Я поменялся dataSourceClass = "org.postgresql.ds.PGSimpleDataSource" с dataSourceClass = "slick.jdbc.DatabaseUrlDataSource" . Это позволяет приложению фактически закрывать коллекции, а не просто возвращать соединение в пул соединений. Это, в свою очередь, позволяет приложению инициализировать новое соединение с соответствующей БД и получать любые изменения в БД.