Почему play framework не запускает мои эволюции?

Недавно я начал новый проект, основанный на scala-play-react-seed.

У меня есть небольшой опыт работы с Play, и у меня есть другие проекты, использующие play-slick и slick-evolutions — все работает нормально, а эволюции распознаются и применяются при запуске.

В новом проекте этого не происходит. С моим подключением к базе данных все в порядке, так что проблема не в этом.

Насколько я вижу, я не получаю никаких ошибок или предупреждений об эволюции.

Я попытался явно включить их в application.conf.

Это мой build.sbt:

// core
libraryDependencies ++= Seq(
  evolutions,
  ehcache,
  ws,
  specs2 % Test,
  guice)

libraryDependencies += "org.scalatestplus.play" %% "scalatestplus-play" % "4.0.2" % Test

// database
libraryDependencies += "com.typesafe.play" %% "play-slick" % "4.0.2"
libraryDependencies += "com.typesafe.play" %% "play-slick-evolutions" % "4.0.2"
libraryDependencies += "org.postgresql" % "postgresql" % "9.4-1201-jdbc41"

У меня есть подозрение, что хук в пользовательском интерфейсе React каким-то образом блокирует серверную часть от сбора этих файлов, но понятия не имею, с чего начать поиск. Любая помощь очень ценится.

Редактировать:

Я почти уверен, что мой application.conf настроен правильно, но вот оно:

slick.dbs.default.profile = "slick.jdbc.PostgresProfile$"
slick.dbs.default.db.driver = "org.postgresql.Driver"
slick.dbs.default.db.url = "jdbc:postgresql://localhost:5432/standups?user=postgres&password=password"

Как я уже говорил, я почти уверен, что это настроено правильно, потому что я могу общаться с базой данных. Это просто эволюции, которые не подхватываются.

Это мой 1.sql, который находится в conf/evolutions/default:

-- !Ups

create table person
(
    id       serial       not null primary key,
    name     varchar(255) not null,
    age      smallint     not null
);

-- !Downs

drop table if exists person cascade;

person slugmandrew    schedule 19.08.2020    source источник


Ответы (3)


Мне непонятно, почему ваши эволюции не работают.

Я попытался подражать вашей настройке в этом коммите: https://github.com/d6y/scala-play-react-seed/commit/408853bda6f26a7a4fdc49487c2bb00d243ac0dc

... где мне пришлось изменить FrontendRunHook, чтобы фактически запустить интерфейс и сервер (через https://github.com/yohangz/scala-play-react-seed/pull/30).

Кроме этого, sbt run запустил приложение и применил эволюцию (подтверждено просмотром базы данных).

Я добавил play.evolutions.db.default.autoApply = true, но без этого вам сказали бы, что база данных нуждается в переносе.

Я также использую JDK 8 с этим, чтобы избежать предупреждения, касающегося Guice (WARNING: An illegal reflective access operation has occurred). Однако вы не упомянули, что видели это, так что это тоже, вероятно, не связано.

person Richard Dallaway    schedule 01.09.2020
comment
Большое спасибо за то, что приложили столько усилий :) Я клонировал ваш форк, и, похоже, он работал нормально, что меня очень озадачило! Оказывается, я был дуфусом - по какой-то причине у меня был скрипт в папке с именем evolutions.default, и с плоскими пакетами он выглядит как две отдельные папки. Серьезный момент с фейспалмом!! Спасибо большое за помощь. Знание того, что это не было настройкой, заставило меня переключить контекст и найти проблему. - person slugmandrew; 01.09.2020
comment
Ой! ???? Рад, что это было полезно для понимания ???? - person Richard Dallaway; 01.09.2020

вам нужно включить параметр конфигурации воспроизведения эволюции

https://www.playframework.com/documentation/2.8.x/Evolutions

play.evolutions.enabled=true


For example, to enable autoApply for all evolutions, you might set play.evolutions.autoApply=true in application.conf or in a system property. To disable autocommit for a datasource named default, you set play.evolutions.db.default.autocommit=false
person vkt    schedule 19.08.2020
comment
Что касается play.evolutions.autoApply=true in application.conf, я считаю, что это только для автоматического применения эволюции, а не для запроса пользователя. - person slugmandrew; 20.08.2020
comment
Эволюции автоматически активируются, если в application.conf настроена база данных и присутствуют скрипты эволюции. Вы можете отключить их, установив play.evolutions.enabled=false - person vkt; 20.08.2020
comment
вам нужно иметь конфигурацию базы данных в application.conf, иначе эволюции не будут включены. - person vkt; 20.08.2020
comment
Спасибо за ответ. Не уверен, что я делаю неправильно, обновил вопрос с дополнительной информацией. Ваше здоровье - person slugmandrew; 20.08.2020

Вам также потребуется вызвать applicationEvolutions в какой-то момент при запуске вашего проекта.

Обычно это делается в экземпляре ApplicationLoader.

Это означает:

  1. добавление класса для компонентов вашего приложения, включая расширение DBComponents with EvolutionsComponents и доступ к applicationEvolutions.
  2. написание класса, который расширяет ApplicationLoader, который перенастраивает ваши компоненты в методе load из ApplicationLoader.
  3. добавление полностью квалифицированного класса в ваш application.conf как play.application.loader=your.package.name.here.MyAppLoader

Вы можете увидеть схему ApplicationLoader и компонентов по адресу: https://www.playframework.com/documentation/2.8.x/ScalaCompileTimeDependencyInjection#Application-entry-point

Особенности смешивания кода базы данных для вызова applicationEvolutions приведены по адресу: https://www.playframework.com/documentation/2.8.x/Evolutions#Enable-evolutions

person Richard Dallaway    schedule 27.08.2020
comment
Привет Ричард. Я думал, что этот ручной запуск требуется только в том случае, если вы хотите использовать DI во время компиляции - это правильно? Раньше все было просто подключено для меня и работало хорошо. Я попробовал это сделать (немного отличается, так как у меня нет доступа к DBComponents из-за отсутствия зависимости jdbc в build.sbt, так как он конфликтует с гладкими депсами). Проблема, с которой я столкнулся, похоже, связана с маршрутизатором - я могу только скомпилируйте его с помощью Routes.empty, что, очевидно, не очень полезно, и эволюция все еще не запускается. - person slugmandrew; 01.09.2020
comment
достаточно справедливо: я использую DI только во время компиляции - person Richard Dallaway; 01.09.2020