/ / Scala і Slick: DatabaseConfigProvider у автономному додатку - scala, slick, playframework-2.5

Scala і Slick: DatabaseConfigProvider в автономному додатку - scala, slick, playframework-2.5

У мене є програма Play 2.5.3, яка використовує Slick для читання об'єкта з DB. Класи обслуговування побудовані таким чином:

class SomeModelRepo @Inject()(protected val dbConfigProvider: DatabaseConfigProvider) {
val dbConfig = dbConfigProvider.get[JdbcProfile]
import dbConfig.driver.api._
val db = dbConfig.db
...

Тепер мені потрібні окремі сценарії Scala длявиконувати деякі операції у фоновому режимі. Мені потрібно підключитися до БД в них, і я хотів би повторно використовувати свої існуючі класи обслуговування, щоб читати об'єкти з БД.

Для створення об'єкта класу SomeModelRepo мені потрібно передати деякий DatabaseConfigProvider як параметр. Я намагався запустити:

object SomeParser extends App {
object testDbProvider extends DatabaseConfigProvider {
def get[P <: BasicProfile]: DatabaseConfig[P] = {
DatabaseConfigProvider.get("default")(Play.current)
}
}
...
val someRepo = new SomeModelRepo(testDbProvider)

однак у мене є помилка: "Немає запуску програми" у рядку з "(Play.current)". Більш того, метод, що існує в об'єкті Play, застарілий, і його слід замінити ДІ.

Чи існує який-небудь спосіб ініціалізувати мій об'єкт класу SomeModelRepo "в рамках автономного об'єкта SomeParser?

З повагою

Відповіді:

0 для відповіді № 1

Коли ви запускаєте програму Play, модуль PlaySlick обробляє налаштування Slick для вас. З нею у вас є два вибору:

  1. вводити DatabaseConfigProvider і отримати туди водія або
  2. зробити глобальний пошук за допомогою DatabaseConfigProvider.get[JdbcProfile](Play.current), що не є кращим.

У будь-якому випадку, вам потрібно запустити програму Play! Оскільки це не так з вашими автономними скриптами, ви отримуєте помилку: "Немає запущеної програми".

Таким чином, вам доведеться використовувати стандартний підхід Slick за допомогою екземплярів db безпосередньо з config:

val db = Database.forConfig("default")

У вас є багато прикладів у Шаблони Lightbend.

EDIT: Вибачте, я не читав ціле питання. Вам дійсно потрібно мати його як іншу програму? Ви можете запускати фонові операції, коли починається ваш додаток, наприклад тут. У цьому прикладі InitialData клас вказується як нетерплячий синглтон, так це Вставити () метод запускається відразу після запуску додатка.