Настройка Slick 3.xx для использования разных баз данных в разных средах - PullRequest
0 голосов
/ 30 марта 2020

Я уже некоторое время запускаю Slick для нашей базы данных Oracle. Теперь я хотел бы также использовать его против H2, в наших интеграционных тестах. Я предполагал, что это только изменение загружаемых драйверов, но теперь я понял, что все мои репозитории пронизаны import slick.jdbc.OracleProfile.api._, что заставляет меня думать, что мои репозитории в данный момент привязаны к OracleSQL.

Какова стандартная процедура для поддержки Slick загрузки драйверов Oracle или H2, основанных на разных файлах конфигурации?

Спасибо

1 Ответ

1 голос
/ 30 марта 2020

Вам нужно будет абстрагировать профиль Slick с помощью JdbcProfile. Это избавит от частей Oracle -specifi c, которые вы определили как проблему.

Похоже, у вас достаточно большое приложение. В этом случае обычно (по моему опыту) сделать профиль Slick параметром для класса или признака, а затем передать указанный профиль c, когда вы знаете, что это такое.

Например (используя пример кода в Essential Slick ) мы можем сказать, что наш профиль приложения должен иметь JdbcProfile:

import slick.jdbc.JdbcProfile

trait Profile {
  val profile: JdbcProfile
}

Тогда для каждого модуль кода базы данных, мы импортируем профиль API:

trait DatabaseModule1 { self: Profile =>
  import profile.api._

  // Write database code here
}

Обратите внимание, как абстрактный profile.api._ импорт заменяет спецификацию базы данных c slick.jdbc.OracleProfile.api._

Если у вас много модулей Вы можете объединить их все вместе в класс кейсов:

class DatabaseLayer(val profile: JdbcProfile) extends
  Profile with
  DatabaseModule1 with
  DatabaseModule2

И, наконец, на краю своей программы вы можете решить, какую конфигурацию использовать:

object Main extends App {

  // At this point, you can make a test and decide which specific
  // database you want to use. Here I'm saying it's always H2:
  val databaseLayer = new DatabaseLayer(slick.jdbc.H2Profile)

  // You can now use methods in `databaseLayer`, 
  // or pass it to other modules in your system
}

Это описано далее в:

...