我尝试了解一些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中表示SQL的"LIKE"运算符?
我想强制光滑创建像
select max(price) from coffees where ...
Run Code Online (Sandbox Code Playgroud)
但光滑的文档没有帮助
val q = Coffees.map(_.price) //this is query Query[Coffees.type, ...]
val q1 = q.min // this is Column[Option[Double]]
val q2 = q.max
val q3 = q.sum
val q4 = q.avg
Run Code Online (Sandbox Code Playgroud)
因为那些q1-q4不是查询,我无法获得结果,但可以在其他查询中使用它们.
这个说法
for {
coffee <- Coffees
} yield coffee.price.max
Run Code Online (Sandbox Code Playgroud)
生成正确的查询但不推荐使用(生成警告:"不推荐使用类ColumnExtensionMethods中的方法max:使用Query.max"). 如何在没有警告的情况下生成此类查询?
另一个问题是通过以下方式聚合:
"select name, max(price) from coffees group by name"
Run Code Online (Sandbox Code Playgroud)
试图解决它
for {
coffee <- Coffees
} yield (coffee.name, coffee.price.max)).groupBy(x => x._1)
Run Code Online (Sandbox Code Playgroud)
产生
select x2.x3, x2.x3, x2.x4 from (select x5."COF_NAME" …Run Code Online (Sandbox Code Playgroud) 更新:我已经编辑了标题并添加了这个文本以更好地解释我想要实现的目标:我正在尝试从头开始创建一个新的应用程序,但不希望业务层知道持久性层,就像人们不希望业务层知道REST API层一样.下面是我想要使用的持久层的示例.我正在寻找与此集成的好建议,即我需要设计/架构方面的帮助,以便在业务逻辑和持久性逻辑之间彻底分离责任.也许是沿着编组和解组持久性对象到域对象的概念.
从SLICK(又名ScalaQuery)测试示例,这是您创建多对多数据库关系的方式.这将创建3个表:a,b和a_to_b,其中a_to_b保持表a和b中的行的链接.
object A extends Table[(Int, String)]("a") {
def id = column[Int]("id", O.PrimaryKey)
def s = column[String]("s")
def * = id ~ s
def bs = AToB.filter(_.aId === id).flatMap(_.bFK)
}
object B extends Table[(Int, String)]("b") {
def id = column[Int]("id", O.PrimaryKey)
def s = column[String]("s")
def * = id ~ s
def as = AToB.filter(_.bId === id).flatMap(_.aFK)
}
object AToB extends Table[(Int, Int)]("a_to_b") {
def aId = column[Int]("a")
def bId = column[Int]("b")
def * = aId ~ …Run Code Online (Sandbox Code Playgroud) 对我来说,如果它们具有功能,它们看起来都非常相似,但是如果不使用它们就很难说(但是).所以我几乎没有问题:
1)它们真的具有可比性(或多或少)吗?
2)有没有使用其中任何一个的企业或大型开源系统的例子?
3)我的印象是Squeryl有更好的文档,在ScalaQuery实际问题的情况下缺少文档?
4)其中哪一个增长更快和/或更快修复错误?
5)它们中的任何一个更容易使用/更高效吗?
有没有人知道使用Play框架和SLICK(ScalaQuery)的好教程或示例项目(github)?我正在努力让他们一起工作.
我收到此错误:
[info] play - Application started (Dev)
[error] application -
! @6b13oi41c - Internal server error, for request [GET /listBooks] ->
play.core.ActionInvoker$$anonfun$receive$1$$anon$1: Execution exception [[NoClassDefFoundError: Could not initialize class scala.slick.ast.opt.Relational$]]
at play.core.ActionInvoker$$anonfun$receive$1.apply(Invoker.scala:134) [play_2.9.1-2.0.2.jar:2.0.2]
at play.core.ActionInvoker$$anonfun$receive$1.apply(Invoker.scala:115) [play_2.9.1-2.0.2.jar:2.0.2]
at akka.actor.Actor$class.apply(Actor.scala:318) [akka-actor-2.0.2.jar:2.0.2]
at play.core.ActionInvoker.apply(Invoker.scala:113) [play_2.9.1-2.0.2.jar:2.0.2]
at akka.actor.ActorCell.invoke(ActorCell.scala:626) [akka-actor-2.0.2.jar:2.0.2]
at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:197) [akka-actor-2.0.2.jar:2.0.2]
Caused by: java.lang.NoClassDefFoundError: Could not initialize class scala.slick.ast.opt.Relational$
at scala.slick.driver.BasicProfile$class.processAST(BasicProfile.scala:18) ~[slick_2.10.0-M4-0.10.0-M2.jar:0.10.0-M2]
at scala.slick.driver.PostgresDriver$.processAST(PostgresDriver.scala:69) ~[slick_2.10.0-M4-0.10.0-M2.jar:0.10.0-M2]
at scala.slick.driver.BasicProfile$class.createQueryBuilder(BasicProfile.scala:22) ~[slick_2.10.0-M4-0.10.0-M2.jar:0.10.0-M2]
at scala.slick.driver.PostgresDriver$.createQueryBuilder(PostgresDriver.scala:69) ~[slick_2.10.0-M4-0.10.0-M2.jar:0.10.0-M2]
at scala.slick.driver.BasicProfile$class.buildSelectStatement(BasicProfile.scala:23) ~[slick_2.10.0-M4-0.10.0-M2.jar:0.10.0-M2]
at scala.slick.driver.PostgresDriver$.buildSelectStatement(PostgresDriver.scala:69) ~[slick_2.10.0-M4-0.10.0-M2.jar:0.10.0-M2]
[error] application -
Run Code Online (Sandbox Code Playgroud)
这是我的书模型:
package …Run Code Online (Sandbox Code Playgroud) 我最近问了一个类似的问题,并得到了一个很好的回答,解决了与Lift Mapper的多对多关系问题.我查看了ScalaQuery/SLICK文档,但没有记录持久化数据的方法,其中涉及链接表.如果有人知道如何使用SLICK进行多对多映射,那么如果你可以分享它就会很棒.
我正在尝试使用Scala Slick 1.0.1过滤可选的日期列.
可能我只是看不到它,但我有一个看起来像这样的表:
case class UserRole(id:UUID, userID:UUID, role:String)
object UserRole extends Table[UserRole]("User_Role") {
//(id: Long = 0l, name: String, active: Boolean) extends KeyedEntity[Long] {
def id = column[UUID]("ID", O.PrimaryKey)
def userID = column[UUID]("user_id")
def vendorID = column[UUID]("vendor_id")
def role = column[String]("role")
def user = foreignKey("user_FK", userID, User)(_.id)
def start = column[java.sql.Date]("startDate")
def endDate = column[Option[java.sql.Date]]("endDate")
def * = id ~ userID ~ role <> (UserRole.apply _, UserRole.unapply _)
}
Run Code Online (Sandbox Code Playgroud)
你会看到endDate是可选的.
如何构造一个我过滤的查询,以便endDate可以是NULL/None还是大于当前(db)日期?仅供参考,我通常使用嵌入式API
谢谢
SIQ的当前状态是呈现在由克里斯托弗·沃格特2011 ScalaDays.它显示的查询是如何工作的,看起来像,但据我记得有没有关于这些类型将如何来表示,例如,如果它仍然需要编写样板代码来解释数据库结构Scala的概念.
F#3.0增加键入提供商(PDC谈话由Don赛姆:视频 ; GOTO哥本哈根谈话由Tomas Petricek:视频,幻灯片,博客文章),这使得它基本上不需要手动编写或生成(另一数据提供者或)一个DB之间的映射和语言/类型系统,因为语言可以直接使用类型提供程序从数据库本身查询结构信息.
ScalaIntegratedQuery是否能够向Scala编译器提供数据库的类型/关系,而无需用户自己编写样板代码?
我在将不同的查询组件组合到单个查询中时遇到了一些麻烦.我的目标是创建一组特征(例如SoftDeletable,HasName,SortedByName,WithTimestamps),我可以简单地将它们混合到Table对象中以添加该行为.
理想情况如下:
abstract class BaseModel[Tuple <: Product,CaseClass](tableName: String)
extends Table[Tuple](tableName) {
def id = column[Int]("id", O.AutoInc, O.PrimaryKey)
def mapped: MappedProjection[CaseClass, TupleClass]
def allQuery = this.map(_.mapped)
final def all = database.withSession { implicit session: Session =>
allQuery.list()
}
...
}
trait SoftDeletable[Tuple <: Product, CaseClass]
extends BaseModel[Tuple,CaseClass] {
def isActive = column[String]("is_active")
def * = super.* ~ isActive
def allQuery = /* here, I'd like to compose super.allQuery
with a filter that returns rows where isActive is true */
}
trait …Run Code Online (Sandbox Code Playgroud)