标签: slick-3.0

1
推荐指数
1
解决办法
1799
查看次数

使用play-slick 1.0.1/slick 3.0无法连接到mysql数据库:配置错误

我正在尝试使用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)

我很感激有关如何解决这个问题的任何建议 - 我猜它是愚蠢的但是我发现很难获得特定于最新版本的光滑的文档和示例 - 并且可以提供附加信息,如果这将有所帮助.

mysql sbt slick-3.0 playframework-2.4

1
推荐指数
1
解决办法
961
查看次数

在 Slick 3.x 中选择特定列会引发类型不匹配

在这个 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)

scala slick slick-3.0

1
推荐指数
1
解决办法
3304
查看次数

光滑:得到表名

使用像这样的表定义:

class Test(_tableTag: Tag) extends Table[TestRow](_tableTag, "test") { ... }
Run Code Online (Sandbox Code Playgroud)

如何从一个实例中取回表名(Tag"test")Test

问题是我可以完美地执行一些查询db run TableQuery[Test].result,但是要编写原始sql,我需要表名.

slick-3.0

1
推荐指数
1
解决办法
758
查看次数

在Slick 3.1.x中的单个事务中更新多行

假设一个表table1有三列col1col2并且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)

scala slick slick-3.0

1
推荐指数
1
解决办法
2634
查看次数

如何在Slick中使用交易

我有这样的插入方法(权重为索引)

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)

scala slick-3.0

1
推荐指数
1
解决办法
1912
查看次数

显式关闭数据库连接

这是我试图优化的代码:

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 slick play-slick slick-3.0

1
推荐指数
1
解决办法
3191
查看次数

Slick 如何将 scala 对象映射到列并在查询中使用对象

我想在光滑的查询中使用我的自定义对象作为值,类似于 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 类型。知道怎么做吗?

scala slick slick-3.0

0
推荐指数
1
解决办法
802
查看次数

如何使用Scala Slick在来自不同数据库(数据源)的表上执行leftJoin?

我有2个数据库(database1和database2)。

  • database1具有带有字段ID的table1
  • database2具有带有字段ID的table2

现在如何使用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)

scala slick slick-3.0 playframework-2.5

0
推荐指数
1
解决办法
150
查看次数

有条件地在中运行Slick语句以进行理解

给出以下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。如何添加条件?

scala slick slick-3.0

0
推荐指数
1
解决办法
767
查看次数