【问题标题】:Why is play framework not running my evolutions?为什么游戏框架没有运行我的进化?
【发布时间】:2020-08-19 16:31:09
【问题描述】:

我最近开始了一个新项目,基于 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 UI 的挂钩会阻止后端以某种方式获取这些文件,但不知道从哪里开始查找。非常感谢任何帮助。

编辑:

我很确定我的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;

【问题讨论】:

    标签: scala playframework slick playframework-evolutions


    【解决方案1】:

    我不清楚为什么你的进化没有运行。

    我已尝试在此提交中模拟您的设置: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) 相关的警告。但是,你没有提到你看到了,所以这也可能无关。

    【讨论】:

    • 非常感谢您付出了这么多努力:) 我克隆了你的叉子,它似乎工作正常,这让我很困惑!原来我是一个杜弗斯——出于某种原因,我将脚本放在一个名为evolutions.default 的文件夹中,并且上面有“扁平包”看起来像两个单独的文件夹。严重的捂脸时刻!!非常感谢您的帮助。知道这不是设置的事情让我切换上下文并真正找到问题。
    • 哎哟! ?很高兴这对弄清楚它很有用?
    【解决方案2】:

    您需要启用 play evolutions 配置参数

    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
    

    【讨论】:

    • 关于play.evolutions.autoApply=true in application.conf 我相信这只是为了自动应用进化,而不是询问用户。
    • 如果在 application.conf 中配置了数据库并且存在进化脚本,则会自动激活进化。您可以通过设置 play.evolutions.enabled=false 来禁用它们
    • 你需要在 application.conf 中有数据库配置,否则进化将无法启用。
    • 感谢您的回复。不知道我做错了什么,已经用更多信息更新了这个问题。干杯
    【解决方案3】:

    您还需要在项目启动时致电applicationEvolutions

    通常会在 ApplicationLoader 的实例中完成。

    这意味着:

    1. 为您的应用程序“组件”添加一个类,包括扩展DBComponents with EvolutionsComponents 和访问applicationEvolutions
    2. 编写一个扩展 ApplicationLoader 的类,它在 ApplicationLoaderload 方法中重新调整您的组件。
    3. 将完全限定类添加到您的application.confplay.application.loader=your.package.name.here.MyAppLoader

    您可以在https://www.playframework.com/documentation/2.8.x/ScalaCompileTimeDependencyInjection#Application-entry-point 看到ApplicationLoader 和组件的轮廓

    混入数据库代码调用applicationEvolutions的具体细节在:https://www.playframework.com/documentation/2.8.x/Evolutions#Enable-evolutions

    【讨论】:

    • 嗨,理查德。我认为只有在您想使用编译时 DI 时才需要手动触发 - 对吗?以前,一切都只是为我连接起来并且运行良好。我已经尝试过了(略有不同,因为我无法访问DBComponents,因为在build.sbt 中缺少jdbc 依赖项,因为它与光滑的部门发生冲突)我遇到的问题似乎是使用路由器 - 我只能用 Routes.empty 编译它,这显然没有多大用处,而且进化仍然没有运行。
    • 很公平:我只使用编译时 DI
    猜你喜欢
    • 2016-02-16
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    • 2013-02-26
    • 1970-01-01
    • 2020-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多