使用 Play Slick
Play Slick 模块让 Slick 成为 Play一等公民。
Play Slick 模块包含两个特性:
- 把Slick集成到Play的应用程序生命周期。
- 支持Play 数据库 evolutions.
Play Slick 当前支持 Slick 3.0 和 Play 2.4, 和 Scala 2.10 至 2.11。
注意: 本指南假定你已经熟悉 Play 2.4 和 Slick 3.0。 此外, 还假定你会使用新的Slick 数据库 I/O Actions API。实际上, 使用被废弃的 Slick Invoker/Execution API 还是有可能的,但它已经不再被支持 - 要注意 Invoker/Execution API 在下一个Slick主要版本已经计划移除。
获得帮助
如果你有使用Play Slick的问题, 检查 FAQ 中有没有包含的答案。如果没有, 随时联系 play-framework user group 。同样,如果你要寻找Slick的帮助, slick user group 将是更好的地方。
最终, 如果你想及时获得Play 和Slick 问题的答案, 和一个详细定义的SLA, 你可能会喜欢 联系 Typesafe , 因为它提供了对这些技术的商业支持。
关于这个释放版本
如果你已经用过Play Slick的以前版本, 你会发现有不少重大的变化。推荐阅读 迁移指南 以平滑升级。
同时,如是你是第一次使用Play Slick, 你会看到,Slick 在 Play中的集成是十分简朴的。这意味着如果你懂Play 和Slick, 使用Play Slick模块会很直观。
配置
添加play-slick库依赖:
"com.typesafe.play" %% "play-slick" % "1.0.1"
上面的依赖也会伴随Slick库的依赖传递。这意味着你不再需要显式添加Slick的依赖。
为支持 Play 数据库 evolutions
Play Slick 支持 Play 数据库 evolutions。
要启用 evolutions, 你需要以下依赖:
"com.typesafe.play" %% "play-slick" % "1.0.1"
"com.typesafe.play" %% "play-slick-evolutions" % "1.0.1"
注意,不需要添加 Play evolutions
组件到你的依赖, 因为它是play-slick-evolutions
模块的传递依赖。
JDBC 驱动依赖
Play Slick 模块没有绑定任何 JDBC驱动。因此, 你需要显式添加你要在应用程序中使用的 JDBC 驱动 。例如, 如果你想使用一个内存数据库,如H2, 你要添加下面的依赖:
"com.h2database" % "h2" % "${H2_VERSION}" // 用实际版本号替换 `${H2_VERSION}`
数据库配置
要使Play Slick模块管理Slick 数据库的生命周期, 重要的一点是你不能在你的代码中显式创建数据库的实例。而是, 你应该在 application.conf文件中提供一个有效的Slick 驱动和数据库配置 (按照惯例,默认Slick 数据库必须叫default
):
# 默认数据库配置
slick.dbs.default.driver="slick.driver.H2Driver$"
slick.dbs.default.db.driver="org.h2.Driver"
slick.dbs.default.db.url="jdbc:h2:mem:play"
首先, 注意上面这段是有效的Slick配置 (要了解你可以用来配置数据库的完整配置参数列表,查阅Slick ScalaDoc Database.forConfig\:Database) - 确保你在文档中展开forConfig
这一行)。
其次,数据库配置要在在名称前面加上 slick.dbs
前缀。实际上, 你可以通过重写配置键play.slick.db.config
的值来更改它。
第三, 在上面那段配置中slick.dbs.default.driver
用来配置 Slick 驱动, 而 slick.dbs.default.db.driver
通过Slick的后端的底层使用JDBC驱动。以上面的配置我们配置 Slick 使用 H2 数据库, 但 Slick 支持几种不同的数据库。查看 Slick 文档 可以了解支持的数据库的完整清单以及匹配的Slick驱动。
Slick 不支持DATABASE_URL
环境变量以同样方式作为默认 Play JBDC 连接池。但从3.0.3版本开始, Slick 提供一个 DatabaseUrlDataSource
,特意为解析此环境变量。
slick.dbs.default.driver="slick.driver.PostgresDriver$"
slick.dbs.default.db.dataSourceClass = "slick.jdbc.DatabaseUrlDataSource"
slick.dbs.default.db.properties.driver = "org.postgresql.Driver"
在一些平台上, 如 Heroku, 你可能换为JDBC_DATABASE_URL
, 如果它可用,会以jdbc:vendor://host:port/db?args
的格式。例如:
slick.dbs.default.driver="slick.driver.PostgresDriver$"
slick.dbs.default.db.driver="org.postgresql.Driver"
slick.dbs.default.db.url=${JDBC_DATABASE_URL}
注意: 不能同时为
slick.dbs.default.driver
和slick.dbs.default.db.driver
提供有效值,当尝试运行你的Play应用程序时,这会导致异常。
要同时配置几种数据库:
# Orders database
slick.dbs.orders.driver="slick.driver.H2Driver$"
slick.dbs.orders.db.driver="org.h2.Driver"
slick.dbs.orders.db.url="jdbc:h2:mem:play"
# Customers database
slick.dbs.customers.driver="slick.driver.H2Driver$"
slick.dbs.customers.db.driver="org.h2.Driver"
slick.dbs.customers.db.url="jdbc:h2:mem:play"
如果某个地方没有正确配置, 你会在浏览器中得到通知:
注意: 仅在你提供有效的Slick配置时,你的应用程序才会启动。
用法
在正确配置Slick数据库后, 你能够以两种不同方式获得一个DatabaseConfig
(这是一个绑定数据库和驱动的 Slick 类型)。通过使用依赖注入, 或通过DatabaseConfigProvider
单例对象进行全局查找。
注意: 一个Slick 数据库实例管理一个线程池和一个连接池。一般而言, 你应该不需要在代码中显式关闭数据库 (通过调用它的
close
方法), 因为Play Slick 模块已经会自动管理它。
通过依赖注入获得DatabaseConfig
这里是一个如何为默认数据库注入DatabaseConfig
实例的示例(如数据库在配置中命名为default
):
class Application @Inject()(dbConfigProvider: DatabaseConfigProvider) extends Controller {
val dbConfig = dbConfigProvider.get[JdbcProfile]
为不同数据库注入DatabaseConfig
实例也是很容易的。在前面添加一个简单的注解@NamedDatabase("<db-name>")
到dbConfigProvider
参数前面即可:
class Application2 @Inject()(@NamedDatabase("<db-name>") dbConfigProvider: DatabaseConfigProvider) extends Controller {
当然, 你要将字符串"<db-name>"
替换为你想要使用的数据库配置的名称。
要参考完整的示例, 请参阅 示例项目 。
通过全局查找获得DatabaseConfig
这里是一个如何为默认数据库查找DatabaseConfig
实例的示例(如数据库在配置中命名为default
):
val dbConfig = DatabaseConfigProvider.get[JdbcProfile](Play.current)
为不同数据库查找DatabaseConfig
实例也是很容易的。简单地通过数据库名称即可:
val dbConfig = DatabaseConfigProvider.get[JdbcProfile]("<db-name>")(Play.current)
当然, 你要将字符串"<db-name>"
替换为你想要使用的数据库配置的名称。
要参考完整的示例, 请参阅示例项目。
在Controller中运行数据库查询
要在你的controller中运行数据库查询, 你需要Slick数据库和驱动。幸运的是, 从上面的内容我们知道如何获得Slick DatabaseConfig
, 因此我们需要运行一个数据库查询。
你需要导入一些类和隐式驱动:
import dbConfig.driver.api._
然后可以定义一个控制器方法,运行一个数据库查询:
def index(name: String) = Action.async { implicit request =>
val resultingUsers: Future[Seq[User]] = dbConfig.db.run(Users.filter(_.name === name).result)
resultingUsers.map(users => Ok(views.html.index(users)))
}
这就像平常使用 Play 和 Slick一样!
配置连接池
查阅 这里 可以找到如何配置连接池的信息。