Настройка зависимости драйвера БД для проектов на основе Slick2 в SBT?

У меня есть два проекта Scala под управлением SBT — models_project и client_project.

models_project содержит модели БД (на основе Slick2). Этот проект содержит все определения таблиц и строк Slick. client_project зависит от models_project для доступа к БД.

Я хочу иметь возможность настроить драйвер в проекте client_project.

Проблема, с которой я столкнулся, заключается в том, что мне нужно импортировать драйвер (например, scala.slick.driver.PostgresDriver.simple._) в models_project, чтобы получить многие типы, которые требуются модели.

Я понял, как настроить их в отдельном/независимом проекте (так что у меня будет driver_project, и от него будут зависеть как client_project, так и models_project), но для этого требуется, чтобы конфигурация выполнялась в проекте driver_project. Чего я действительно хочу, так это чтобы мой models_project не зависел от драйвера, а для client_project была конфигурация того, какой драйвер использовать, от чего он будет передавать models_project, в зависимости от этого.

Спасибо за вашу помощь!


person polo    schedule 01.03.2014    source источник
comment
Если вы используете класс (драйвер) в проекте, скажем, models_project, вы должны объявить его библиотеку как зависимость проекта. Это потому, что проект использует его напрямую. Я думаю, что это скорее архитектурный вопрос Slick, а не SBT.   -  person Jacek Laskowski    schedule 02.03.2014


Ответы (1)


Мне тоже потребовалось некоторое время, чтобы понять это. У меня есть проект github, который я использовал для проверки.

https://github.com/drstevens/slick-testing

Я определил черту SlickDriver, которая позволяет вам смешивать настроенный драйвер с конкретными реализациями (https://github.com/drstevens/slick-testing/blob/master/src/main/scala/com/daverstevens/sql/SlickDriver.scala)

trait SlickDriver {
  val driver: JdbcDriver
}

trait MySqlSlickDriver extends SlickDriver {
  val driver = MySQLDriver
}

trait H2SlickDriver extends SlickDriver {
  val driver = H2Driver
}

Вы можете расширить SlickDriver в признаке, в котором вы определяете свою модель. Затем вам просто нужно добавить соответствующий SlickDriver во время настройки. Всякий раз, когда вам обычно нужно импортировать драйвер, вместо этого импортируйте драйвер, который смешивается с экземпляром имеющейся у вас модели.

Пример см. в разделе trait SqlModel.

person drstevens    schedule 01.03.2014
comment
Спасибо за ваш ответ и за то, что нашли время, чтобы написать пример и отправить его на github. Насколько я понимаю, ваше решение позволяет настроить драйвер, но не позволяет вводить драйвер во время выполнения. Проблема в том, что я хочу хранить модели в независимом репо (и, следовательно, в проекте SBT), который может использовать любой (добавив его как зависимость проекта sbt). - person polo; 02.03.2014
comment
Я написал код для себя некоторое время назад, и он уже был на githubs. Slick позволяет вам делать так много только во время выполнения. Мой код позволяет вам настроить драйвер во время выполнения, если драйвер был скомпилирован как возможная опция для настройки. Я понял это, основываясь на этой ветке списка рассылки Slick. groups.google.com/forum/#!topic/scalaquery/BpPOj_NSOjc - person drstevens; 02.03.2014