课程表

Slick课程

工具箱
速查手册

Slick 概述

当前位置:免费教程 » 数据库/运维 » Slick

概述

Slick 对于 Scala 来说,有如 LINQ 至于 C#,或者类似于其它平台上的 ORM 系统,它使用应用使用数据库有如使用 Scala 内置的集合类型(比如列表,集合等)一样方便。当然如有需要你还是可以直接使用 SQL 语句来查询数据库。

下面为使用 Slick 的代码片段:

  1. val limit = 10.0
  2. // Your query could look like this:
  3. ( for( c <- coffees; if c.price < limit ) yield c.name ).list
  4. // Or using more plain SQL String Interpolation:
  5. sql"select COF_NAME from COFFEES where PRICE < $limit".as[String].list
  6. // Both queries result in SQL equivalent to:
  7. // select COF_NAME from COFFEES where PRICE < 10.0

使用 Slick 而不直接使用 SQL 语句,可以使用编译器帮助发现一些类型错误,同时 Slick 可以为不同的后台数据库类型生成查询。

它具有如下的一些特征:

Scala

所有查询,表格和字段映射,以及类型都采用普通的 Scala 语法。

  1. class Coffees(tag: Tag) extends Table[(String, Double)](tag, "COFFEES") {
  2. def name = column[String]("COF_NAME", O.PrimaryKey)
  3. def price = column[Double]("PRICE")
  4. def * = (name, price)
  5. }
  6. val coffees = TableQuery[Coffees]

数据访问接口类型 Scala 的集合类型

  1. // Query that only returns the "name" column
  2. coffees.map(_.name)
  3. // Query that does a "where price < 10.0"
  4. coffees.filter(_.price < 10.0)

类型安全

你使用的 IDE 可以帮助你写代码在编译时而无需到运行时就可以发现一些错误

  1. // The result of "select PRICE from COFFEES" is a Seq of Double
  2. // because of the type safe column definitions
  3. val coffeeNames: Seq[Double] = coffees.map(_.price).list
  4. // Query builders are type safe:
  5. coffees.filter(_.price < 10.0)
  6. // Using a string in the filter would result in a compilation error

可以组合

查询接口为函数,这些函数可以多次组合和重用。

  1. // Create a query for coffee names with a price less than 10, sorted by name
  2. coffees.filter(_.price < 10.0).sortBy(_.name).map(_.name)
  3. // The generated SQL is equivalent to:
  4. // select name from COFFEES where PRICE < 10.0 order by NAME

支持的数据库系统

  • DB2 (via slick-extensions)
  • Derby/JavaDB
  • H2
  • HSQLDB/HyperSQL
  • Microsoft Access
  • Microsoft SQL Server (via slick-extensions)
  • MySQL
  • Oracle (via slick-extensions)
  • PostgreSQL
  • SQLite

对于其它的一些数据库类型 Slick 也提供了有限的支持。

查询接口 Lifted Embedding

Sclick 使用 Lifted Embedding 作为标准的数据库查询接口,此外 Direct Embedding 接口正在开发测试当中。

Lifted Embedding 的名称来自于,你不是使用标准的 Scala 数据类型来访问查询数据库,而是使用 Rep 构造器来提升(Lift)Scala 的基本数据类型,然后使用提升后的数据类型来访问数据库,比如标准的 Scala 集合的例子:

  1. case class Coffee(name: String, price: Double)
  2. val coffees: List[Coffee] = //...
  3. val l = coffees.filter(_.price > 8.0).map(_.name)
  4. // ^ ^ ^
  5. // Double Double String

而对应的提升之后的例子:

  1. class Coffees(tag: Tag) extends Table[(String, Double)](tag, "COFFEES") {
  2. def name = column[String]("COF_NAME")
  3. def price = column[Double]("PRICE")
  4. def * = (name, price)
  5. }
  6. val coffees = TableQuery[Coffees]
  7. val q = coffees.filter(_.price > 8.0).map(_.name)
  8. // ^ ^ ^
  9. // Rep[Double] Rep[Double] Rep[String]

所有的基本 Scala 类型,都提升为 Rep。即使是 8.0 字面量也被提升为 Rep[Double] 类型。

后面的例子,我们会采用 Chinook 数据库作为例子。

Chinook 数据库前身为著名的 Northwind 数据库,它的数据模型如下:

图片

转载本站内容时,请务必注明来自W3xue,违者必究。
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号