我正在尝试使用play 2.4.2从anorm迁移到slick,并获得配置错误:
play.api.Configuration$$anon$1: Configuration error[Cannot connect to database [dethcs]]
at play.api.Configuration$.configError(Configuration.scala:178) ~[play_2.11-2.4.0.jar:2.4.0]
...
Caused by: slick.SlickException: Error getting instance of Slick driver "slick.driver.MySQLDriver"
...
Caused by: java.lang.NoSuchMethodException: slick.driver.MySQLDriver.<init>()
Run Code Online (Sandbox Code Playgroud)
以前我在SO上发现的答案都集中在拥有正确的MySQL驱动程序和其他依赖项.我相信我的build.sbt涵盖了相关的基础,包括:
libraryDependencies += "mysql" % "mysql-connector-java" % "5.1.36"
libraryDependencies += "com.typesafe.play" %% "play-slick" % "1.0.1"
libraryDependencies += "com.typesafe.play" %% "play-slick-evolutions" % "1.0.1"
Run Code Online (Sandbox Code Playgroud)
我的application.conf中的相关行是:
slick.dbs.dethcs.db.driver="com.mysql.jdbc.Driver"
slick.dbs.dethcs.driver="slick.driver.MySQLDriver"
slick.dbs.dethcs.user="redacted"
slick.dbs.dethcs.db.url="jdbc:mysql://localhost/mydb"
slick.dbs.dethcs.password="redacted"
Run Code Online (Sandbox Code Playgroud)
我很感激有关如何解决这个问题的任何建议 - 我猜它是愚蠢的但是我发现很难获得特定于最新版本的光滑的文档和示例 - 并且可以提供附加信息,如果这将有所帮助.
在这个 Slick 函数中,我从 User 表中读取并返回一个 SessionUser 对象(SessionUser 的列比 User 少)。
问题是这段代码无法编译,对于 SessionUser 中的每个字段,它都会给我错误type mismatch; found : slick.lifted.Rep[String] required: String
。此错误的含义是什么以及如何修复它?
def readByUserid (userid: String) : Option[SessionUser] = {
val db = Database.forConfig(Constant.dbBank)
try {
val users = TableQuery[UserDB]
val action = users.filter(_.userid === userid)
.map(u => SessionUser(u.userid, u.firstName, u.lastName)).result
val future = db.run(action)
val result = Await.result(future, Duration.Inf)
result
}
finally db.close
}
Run Code Online (Sandbox Code Playgroud) 使用像这样的表定义:
class Test(_tableTag: Tag) extends Table[TestRow](_tableTag, "test") { ... }
Run Code Online (Sandbox Code Playgroud)
如何从一个实例中取回表名(Tag"test")Test
?
问题是我可以完美地执行一些查询db run TableQuery[Test].result
,但是要编写原始sql,我需要表名.
假设一个表table1
有三列col1
,col2
并且col3
。另外,假设我需要col1
根据的值进行更新col2
。例如,使用以下SQL语句
update table1 set col1=111 where col2=222
Run Code Online (Sandbox Code Playgroud)
假设我必须更新1000次,table1
并且以下信息如下Seq
:
case class Table1 (col1: Int, col2: Int, col3: Int)
val list = Seq(Table1(111,222,333),Table1(111,333,444), .... )
Run Code Online (Sandbox Code Playgroud)
在Slick 3.1.x中更新1000行的最佳方法是什么?是否可以使用运行批处理语句foreach
?
val action = table1.foreach(....)
Run Code Online (Sandbox Code Playgroud) 我有这样的插入方法(权重为索引)
implicit def run[A](action: DBIOAction[A, NoStream, _ <: slick.dbio.Effect]): Future[A] = {
db.run(action)
}
def insert(newCategory: CategoryExtractor): Future[Either[String, CategoryResponse]] = {
category.map(_.weight).max.result.flatMap {
case Some(weight) =>
val temp = newCategory.copy(weight = weight+1)
(category += temp).andThen(DBIO.successful(Right(toCategoryExtractor(temp))))
case None =>
val temp = newCategory.copy(weight = 1)
(category += temp).andThen(DBIO.successful(Right(toCategoryExtractor(temp))))
}
}
Run Code Online (Sandbox Code Playgroud)
我叫它两次
insert(CategoryExtractor("1", "name", "scala every where", 0, 0, 0, None)) onComplete {
case Success(data) => println(data)
}
insert(CategoryExtractor("2", "name", "haskell every where", 0, 0, 0, None)) onComplete {
case Success(data) => …
Run Code Online (Sandbox Code Playgroud) 这是我试图优化的代码:
object UserRepo
{
val users = TableQuery[Users]
val dbName = "db"
lazy val queryAllUsers = for (user <- users) yield user
type UserRow = (Int, String, String, String)
def getAll() : Future[ Seq[UserRow] ] =
{
val db = Database.forConfig( dbName )
val f: Future[Seq[UserRow]] = db.run( queryAllUsers.result )
f.onComplete {
case Success(_) => { db.close() }
case Failure(_) => { db.close() }
}
f
}
}
Run Code Online (Sandbox Code Playgroud)
我将对数据库进行多次查询,我试图在创建数据库连接的地方删除字符串。是否有任何执行上下文可以用来显式关闭连接?这样代码看起来会更简洁?
是否可以选择在 Future.onComplete 范围内使用数据库连接?
谢谢
我想在光滑的查询中使用我的自定义对象作为值,类似于 Scala Enumeration。
sealed trait UserStatus
object UserStatus {
object Active extends UserStatus
object Deleted extends UserStatus
}
Run Code Online (Sandbox Code Playgroud)
我已经为 UserStatus 定义了 MappedColumnType 并且它工作正常。
implicit val UserStatusColumn = MappedColumnType.base[UserStatus, String](_.toString, _ => UserStatus.Active)
Run Code Online (Sandbox Code Playgroud)
直到我想在查询中使用这些对象。
for {
u <- slickUsers
if u.status === UserStatus.Active
} yield u
Run Code Online (Sandbox Code Playgroud)
我得到错误
Error:(26, 34) type mismatch;
found : models.UserStatus.Active.type
required: slick.lifted.Rep[?]
if u.status === UserStatus.Active
Run Code Online (Sandbox Code Playgroud)
当我明确说它是 UserType 时,它工作正常:
for (u <- slickUsers if u.status === UserStatus.Active.asInstanceOf[UserStatus]) yield u
Run Code Online (Sandbox Code Playgroud)
我需要以某种方式提示 Slick Active.type 是 UserStatus 类型。知道怎么做吗?
我有2个数据库(database1和database2)。
现在如何使用Slick执行leftJoin(如下所示)?
SELECT tb1.`id`
FROM `database1`.`table1` t1
LEFT JOIN `database1`.`table2` t2 ON t1.`id`=t2.`id`
Run Code Online (Sandbox Code Playgroud) 给出以下Slick代码:
val doUpdate = true
val table1 = TableQuery[Table1DB]
val table2 = TableQuery[Table2DB]
val table3 = TableQuery[Table3DB]
val action = (for {
_ <- table1.filter(_.id === id).update(table1Record)
_ <- table2.filter(_.id === id).update(table2Record)
_ <- table3.filter(_.id === id).update(table3Record)
} yield ()).transactionally
Run Code Online (Sandbox Code Playgroud)
我需要更新,table2
并且table3
仅在变量doUpdate为true的情况下。这是我的尝试:
val action = (for {
_ <- table1.filter(_.id === id).update(table1Record)
_ <- table2.filter(_.id === id).update(table2Record)
if (doUpdate == true)
_ <- table3.filter(_.id === id).update(table3Record)
if (doUpdate == true)
} yield ()).transactionally
Run Code Online (Sandbox Code Playgroud)
这可以编译,但是当我运行它时,出现以下错误Action.withFilter failed
。如何添加条件?