我有一个使用 scala.play 的应用程序,通过 jdbc 连接到 postgresql 数据库并玩进化,我一直在尝试迁移到使用 slick,以减少数据库客户端中的样板数量..
遵循 slick 的文档并不会产生令人失望的结果。
这就是我所拥有的和我得到的, build.sbt 的一部分
libraryDependencies += "com.typesafe.slick" %% "slick" % "3.5.0-M4"
libraryDependencies +="org.slf4j" % "slf4j-nop" % "1.7.26"
libraryDependencies += "com.typesafe.slick" %% "slick-hikaricp" % "3.5.0-M4"
libraryDependencies += "org.postgresql" % "postgresql" % "42.6.0"
// Better field mappings for Postgres/Slick
libraryDependencies += "com.github.tminglei" %% "slick-pg" % "0.20.4"
libraryDependencies += "com.github.tminglei" %% "slick-pg_circe-json" % "0.20.4"
libraryDependencies += "com.typesafe.play" %% "play-slick" % "5.2.0-M3"
libraryDependencies += "com.typesafe.play" %% "play-slick-evolutions" % "4.0.2"
应用程序.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 调用
请帮助我理解我哪里出了问题
第一个问题是
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=""