Slick 不使用 Play Framework 运行 Evolutions

问题描述 投票:0回答:1

我有一个使用 scala.play 的应用程序,通过 jdbc 连接到 postgresql 数据库并玩进化,我一直在尝试迁移到使用 slick,以减少数据库客户端中的样板数量..

遵循 slick 的文档并不会产生令人失望的结果。

这就是我所拥有的和我得到的, build.sbt 的一部分

libraryDependencies += "com.typesafe.slick" %% "slick" % "3.4.1"
libraryDependencies +="org.slf4j" % "slf4j-nop" % "1.7.26"
libraryDependencies += "com.typesafe.slick" %% "slick-hikaricp" % "3.4.1"
libraryDependencies += "org.postgresql" % "postgresql" % "42.6.0"

// Better field mappings for Postgres/Slick
libraryDependencies += "com.github.tminglei" %% "slick-pg" % "0.21.1"
libraryDependencies += "com.github.tminglei" %% "slick-pg_circe-json" % "0.21.1"

libraryDependencies += "com.typesafe.play" %% "play-slick" % "5.1.0"
libraryDependencies += "com.typesafe.play" %% "play-slick-evolutions" % "5.1.0" % Test

应用程序.conf

app = {
  connectionPool = "HikariCP"
  dataSourceClass = "org.postgresql.ds.PGSimpleDataSource"
  properties = {
    serverName = "localhost"
    portNumber = "5432"
    databaseName = "app"
    user = "app"
    password = "password"
  }
  numThreads = 10
}

还有一个班级

package com.cask.db

import com.google.inject.Inject
import org.joda.time.DateTime
import slick.jdbc.PostgresProfile.api._
import java.sql.Timestamp
import scala.util.Random

class SlickDBClient @Inject()() extends UsersTable {
  val db = Database.forConfig("app")

  def testAdd(): Unit ={
    val foo = UserTableRow(None,randomString,randomString,true,"2342","234234","234234",None,Some(12),new Timestamp(DateTime.now().getMillis()),new Timestamp(DateTime.now().getMillis()),None,"",None)
    db.run(addUsersQuery.insertOrUpdate(foo))
  }

  def randomString():String = {
    Iterator.continually(Random.nextPrintableChar()).filter(_.isLetterOrDigit).take(8).mkString
  }

  private lazy val addUsersQuery = users returning users.map(_.id) into (
    (f, id) => f.copy(id = Some(id))
  )
}

冷编译并运行,但没有应用进化,并且可以毫无例外地调用 testadd ,但显然它不起作用,因为没有应用进化,之前只使用 play 和 jdbc 就在没有光滑的情况下应用了进化

我已将其推送到 github encase,这有帮助 https://github.com/ArthurGibbs/scalaApp

万一有人查看代码 DatabaseClient 是我之前使用的代码,使用 jdbc 而不使用 slick,我已经为 di 设置了默认值以使用模拟代码,因为我必须删除一些我读过的我无法使用的依赖项与 slick 同时,SlickDBClient 被端点 /api/users/testSlick 调用

请帮助我理解我哪里出了问题

scala playframework slick
1个回答
1
投票

第一个问题是

play-slick-evolutions
的测试范围是
build.sbt
% Test
必须从

中删除
libraryDependencies += "com.typesafe.play" %% "play-slick-evolutions" % "5.1.0" % Test

第二个问题是您在

play jdbc datsources config
中使用
slick datasources config
而不是
application.conf
。添加以下行将使进化模块工作

slick.dbs.app.profile="slick.jdbc.PostgresProfile$"
slick.dbs.app.db.url = "jdbc:postgresql://localhost:5432/app"
slick.dbs.app.db.user="app"
slick.dbs.app.db.password="password"

文章Play Slick 迁移指南 - 数据库配置有助于理解为什么您的应用程序没有运行进化脚本

在 Play Slick 的过去版本(使用 Slick 2.1 或更早版本)中,您配置 Slick 数据源的方式与配置 Play JDBC 数据源完全相同。现在情况不再是这样,以下配置现在将被 Play Slick 忽略

db.default.driver=org.h2.Driver
db.default.url="jdbc:h2:mem:play"
db.default.user=sa
db.default.password=""

以下是您需要迁移上述配置的方法:

slick.dbs.default.profile="slick.jdbc.H2Profile$" # You must provide the > required Slick profile! 
slick.dbs.default.db.driver=org.h2.Driver
slick.dbs.default.db.url="jdbc:h2:mem:play"
slick.dbs.default.db.user=sa
slick.dbs.default.db.password=""
© www.soinside.com 2019 - 2024. All rights reserved.