我尝试了解一些Slick的作品以及它需要什么.
这是一个例子:
package models
case class Bar(id: Option[Int] = None, name: String)
object Bars extends Table[Bar]("bar") {
def id = column[Int]("id", O.PrimaryKey, O.AutoInc)
// This is the primary key column
def name = column[String]("name")
// Every table needs a * projection with the same type as the table's type parameter
def * = id.? ~ name <>(Bar, Bar.unapply _)
}
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下*这里方法的目的是什么<>,为什么unapply?什么是Projection - 方法~'返回实例Projection2?
我正在使用Slick与Play Framework 2.1,我有一些麻烦.
鉴于以下实体......
package models
import scala.slick.driver.PostgresDriver.simple._
case class Account(id: Option[Long], email: String, password: String)
object Accounts extends Table[Account]("account") {
def id = column[Long]("id", O.PrimaryKey, O.AutoInc)
def email = column[String]("email")
def password = column[String]("password")
def * = id.? ~ email ~ password <> (Account, Account.unapply _)
}
Run Code Online (Sandbox Code Playgroud)
...我必须为特定的数据库驱动程序导入一个包,但我想在生产中使用H2进行测试和PostgreSQL.我该怎么办?
我能够通过覆盖单元测试中的驱动程序设置来解决此问题:
package test
import org.specs2.mutable._
import play.api.test._
import play.api.test.Helpers._
import scala.slick.driver.H2Driver.simple._
import Database.threadLocalSession
import models.{Accounts, Account} …Run Code Online (Sandbox Code Playgroud) 如何使用Slick Lifted Embedding更新多个列?这份文件并没有多说.
我希望它是这样的
Query(AbilitiesTable).filter((ab: AbilitiesTable.type) => ab.id === ability_id).map((ab: AbilitiesTable.type) => (ab.verb, ab.subject)).update("edit", "doc")
Run Code Online (Sandbox Code Playgroud) 我正在从Slick迁移到Slick 2,在Slick 2中你想tupled在投影到案例类时使用该方法(如http://slick.typesafe.com/doc/2.0.0-所示)RC1/migration.html)
问题是当case类有一个伴随对象时,即如果你有这样的东西
case class Person(firstName:String,lastName:String) {
}
Run Code Online (Sandbox Code Playgroud)
与伴侣对象一起
object Person {
def something = "rawr"
}
Run Code Online (Sandbox Code Playgroud)
在相同的范围内,该tupled方法不再有效,因为它试图运行tupled的object,而不是,case class.
有没有一种方法来检索case class的Person,而不是object,所以你可以调用tupled正确?
有没有办法观察将由Query?生成的SQL语句?
例如,我有这个:
val q = actions.filter(v => v.actionHash === hash && v.carriedAt > past)
我可以查看其底层原始SQL吗?
我正在使用Slick 1,我必须能够在查询中应用过滤器来查找与相关表中的条件匹配的所有实体.
这个使用Slick文档的例子显示了我想要做的事情(这是一个与我的情况很接近的人为例子).
在这里,我想要西海岸供应商提供的所有咖啡.我只想要咖啡,我只对导航到供应商以应用过滤器感兴趣:
val westCoast = Seq("CA", "OR", "WA")
val implicitInnerJoin = for {
c <- Coffees
s <- Suppliers if c.supID === s.id && s.state inSet westCoast
} yield c
Run Code Online (Sandbox Code Playgroud)
这项工作正常,但如果在Suppliers表中有多个匹配项,它将复制咖啡.
明显的解决方法是在普通的SQL中做一个SELECT DISTINCT; 但是,我在这里找不到办法.
你理论上可以做一个:
query.list.distinct
Run Code Online (Sandbox Code Playgroud)
结果已经返回后; 但是,我也实现了PAGING支持,因此一旦已经从数据库返回,您就不希望处理结果.这是分页支持:
query.drop(offset).take(limit).list
Run Code Online (Sandbox Code Playgroud)
所以,简而言之,我需要一种在我的查询中指定SELECT DISTINCT的方法.
有人有主意吗?
我写的这段代码完美无缺
class Items(tag: Tag) extends Table[Item](tag, "ITEMS") {
def id = column[Long]("ITEMS_ID", O.PrimaryKey, O.AutoInc)
def name = column[String]("ITEMS_NAME")
def price = column[Double]("ITEMS_PRICE")
def * = (id, name, price) <> ((Item.apply _).tupled, Item.unapply _)
}
object Shop extends Shop{
val items = TableQuery[Items]
val db = Database.forConfig("h2mem1")
def create(name: String, price: Double) : Int = {
val action = items ++= Seq(Item(0, name, price))
val future1 = db.run(action)
val future2 = future1 map {result =>
result map {x => x}
} …Run Code Online (Sandbox Code Playgroud) 我试图学习使用Slick来查询MySQL.我有以下类型的查询工作来获取单个Visit对象:
Q.query[(Int,Int), Visit]("""
select * from visit where vistor = ? and location_code = ?
""").firstOption(visitorId,locationCode)
Run Code Online (Sandbox Code Playgroud)
我想知道的是如何更改以上内容以查询以获取Locations集合的List [Visit] ...类似这样的内容:
val locationCodes = List("loc1","loc2","loc3"...)
Q.query[(Int,Int,List[String]), Visit]("""
select * from visit where vistor = ? and location_code in (?,?,?...)
""").list(visitorId,locationCodes)
Run Code Online (Sandbox Code Playgroud)
Slick有可能吗?
我正在尝试Slick 3.0.0-RC1而且我遇到了一个奇怪的问题.
这是我的代码:
import slick.driver.SQLiteDriver.api._
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.Await
import scala.concurrent.duration.Duration
lazy val db = Database.forURL(
url = "jdbc:sqlite:thebase.db",
driver = "org.sqlite.JDBC"
)
case class Issue(id: Option[Int], name: String)
class IssueTable(tag: Tag) extends Table[Issue](tag, "issue"){
def id = column[Int]("issue_id", O.PrimaryKey)
def name = column[String]("name")
def * = (id.?, name) <> (Issue.tupled, Issue.unapply _)
}
val issueQuery = TableQuery[IssueTable]
Await.result(db.run(issueQuery.result), Duration.Inf) // This does not compile
Run Code Online (Sandbox Code Playgroud)
错误是:
"无法解析符号结果"
阅读文档我不能真正理解为什么这会失败.我在这里错过了什么吗?
解析度
szeiger指出,这可能是"IntelliJ的演示编译器"中的一个错误,而且这一点很明显.
Slick历来依赖于JDBC驱动程序,它在内部阻止等待套接字I/O以响应查询.每个未完成的数据库调用都需要一个线程来阻塞套接字; 因此,它与ReactiveMongo,postgresql-async和mysql-async在同一意义上并不是真正的反应,它们一直是异步的.
Slick 3.0在这方面有什么变化吗?或者我对此感到困惑?
scala ×10
slick ×10
slick-3.0 ×2
asynchronous ×1
case-class ×1
database ×1
scala-2.10 ×1
scalaquery ×1
singleton ×1
sql ×1