文档

§Play Slick 迁移指南

本指南介绍如何从 Play Slick 迁移到支持新 Slick 3.0 API 的版本。

假设您已经将项目迁移到使用 Play 2.5(请参阅 Play 2.5 迁移指南),您已经阅读了 Slick 文档,并且已准备好将 Play 应用程序迁移到使用新的 Slick 数据库 I/O Actions API。

§构建变更

在您的 sbt 构建中更新 Play Slick 依赖项,以匹配 设置 部分中提供的版本。

§已移除 H2 数据库依赖项

以前的 Play Slick 版本捆绑了 H2 数据库库。现在不再是这种情况。因此,如果您想使用 H2,则需要将其显式添加到项目的依赖项中。

"com.h2database" % "h2" % "${H2_VERSION}" // replace `${H2_VERSION}` with an actual version number

§Evolutions 支持在单独的模块中

数据库演变 的支持曾经包含在 Play Slick 中。现在不再是这种情况。因此,如果您正在使用演变,则现在需要添加一个额外的依赖项到 play-slick-evolutions,如 此处 所述。

如果您没有使用演变,则现在可以安全地从 application.conf 中删除 evolutionplugin=disabled

§数据库配置

在 Play Slick 的过去版本中(使用 Slick 2.1 或更早版本),您配置 Slick 数据源的方式与配置 Play JDBC 数据源的方式相同。现在情况不再如此,以下配置将被 Play Slick **忽略**。

db.default.driver=org.h2.Driver
db.default.url="jdbc:h2:mem:play"
db.default.user=sa
db.default.password=""

此更改有几个原因。首先,以上配置不是有效的 Slick 配置。其次,从 Slick 3 开始,您不仅要配置数据源,还要配置连接池和线程池。因此,Play Slick 使用完全不同的路径来配置 Slick 数据库是有意义的。Slick 配置的默认路径现在是 slick.dbs

以下是您迁移上述配置的方式

slick.dbs.default.profile="slick.jdbc.H2Profile$" # You must provide the required Slick profile! 
slick.dbs.default.db.driver=org.h2.Driver
slick.dbs.default.db.url="jdbc:h2:mem:play"
slick.dbs.default.db.user=sa
slick.dbs.default.db.password=""

**注意**:如果您的数据库配置包含连接池设置,请注意您需要迁移这些设置。但是,这可能有点棘手,因为 Play 2.3 默认连接池曾经是 BoneCP,而 Slick 3 默认连接池是 HikariCP。阅读 此处 以了解如何配置连接池。

§自动 Slick 驱动程序检测

Play Slick 以前会自动从数据源配置中推断所需的 Slick 驱动程序。此功能已被删除,因此您必须为每个 Slick 数据库配置在您的 **application.conf** 中提供要使用的 Slick 驱动程序。

删除此方便功能的原因是,我们希望只接受有效的 Slick 配置。此外,并非总是可以从数据库配置中自动检测到正确的 Slick 驱动程序(如果可以,那么 Slick 已经提供了这样的功能)。

因此,您需要进行以下更改

§DBActionDBSessionRequest 已被删除

Play Slick 以前提供了一个 DBAction,它对以下方面很有用

DBAction 在使用 Slick 2.1 时确实很方便。但是,随着新的 Slick 3 版本的发布,我们不再需要它。原因是 Slick 3 带有一个新的异步 API(又名数据库 I/O 操作 API),它不需要用户操作 SessionConnection。这使得 DBSessionRequestDBAction 以及它的亲密朋友 CurrentDBActionPredicatedDBAction 完全过时,这就是它们被移除的原因。

话虽如此,迁移你的代码应该像将所有 DBAction 及其朋友的出现更改为标准的 Play Action.async 一样简单。点击 这里 查看示例。

§线程池

Play Slick 以前提供一个单独的线程池来执行需要访问数据库的控制器的操作。Slick 3 已经完全做到了这一点,因此 Play Slick 不再需要创建和管理额外的线程池。因此,以下配置参数实际上已经过时,应该从你的 applications.conf 中删除

db.$dbName.maxQueriesPerRequest
slick.db.execution.context

参数 db.$dbName.maxQueriesPerRequest 用于限制线程池中排队的任务数量。在 Slick 3 中,你可以通过调整配置参数 numThreadsqueueSize 来获得类似的结果。阅读 Slick ScalaDoc 的 Database.forConfig(确保在文档中展开 forConfig 行)。

虽然参数 slick.db.execution.context 用于命名 Play Slick 创建的线程池。在 Slick 3 中,每个线程池都使用 Slick 数据库配置路径命名,例如,如果在你的 application.conf 中,你为名为 default 的数据库提供了 Slick 配置,那么 Slick 将创建一个名为 default 的线程池来执行默认数据库上的数据库操作。请注意,线程池使用的名称不可配置。

§Profile 已被移除

特征 Profile 已被移除,你可以使用 HasDatabaseConfigProviderHasDatabaseConfig 来获得类似的结果。

要使用的特征取决于你选择检索 Slick 数据库和驱动程序(即 DatabaseConfig 的实例)的方法。如果你决定使用依赖注入,那么 HasDatabaseConfigProvider 将非常适合你。否则,请使用 HasDatabaseConfig

阅读 这里,了解如何使用依赖注入与全局查找来检索 DatabaseConfig 的实例。

§Database 已被移除

Database 对象已被移除。要检索 Slick 数据库和驱动程序(即 DatabaseConfig 的实例),请阅读 此处

§Config 已被移除

Config 对象以及 SlickConfigDefaultSlickConfig 已被移除。这些抽象不再需要。如果您以前调用 Config.driverConfig.datasource 来检索 Slick 驱动程序和数据库,您现在应该使用 DatabaseConfigProvider。有关详细信息,请阅读 此处

§SlickPlayIteratees 已被移除

如果您以前使用 SlickPlayIteratees.enumerateSlickQuery 从数据库流式传输数据,您会很高兴知道这样做变得容易多了。Slick 3 实现了 reactive-streams SPI (服务提供者接口),Play 2.5 提供了一个实用程序类,可以方便地将响应式流转换为 Play 枚举器。

在 Slick 中,您可以通过在 Slick 数据库实例上调用 stream 方法(而不是急切的 run)来获取响应式流。要将流转换为枚举器,只需调用 play.api.libs.streams.Streams.publisherToEnumerator,并将流作为参数传递。

有关完整示例,请查看 此示例项目

§DDL 支持已被移除

以前版本的 Play Slick 包含一个 DDL 插件,该插件将读取您的 Slick 表定义,并在重新加载时自动创建架构更新。虽然这是一个有趣且有用的功能,但底层实现很脆弱,并且依赖于您的表可以通过模块(即 Scala object)访问的假设。这种编码模式之所以可能,是因为 Play Slick 允许导入通过顶级导入提供的 Slick 驱动程序。但是,由于对 自动检测 Slick 驱动程序 的支持已被移除,您将不再为 Slick 驱动程序声明顶级导入。这意味着 Slick 表将不再可以通过模块访问。这一事实打破了 DDL 插件初始实现中所做的假设,这也是该功能被移除的原因。

上述结果是您负责创建和管理项目的数据库架构。因此,每当您在代码中更改 Slick 表时,请确保也更新数据库架构。如果您发现手动保持数据库架构和代码中相关表定义同步很繁琐,您可能需要查看 Slick 中提供的代码生成功能。

下一步: Play Slick 高级主题


发现文档中的错误?此页面的源代码可以在 这里 找到。阅读完 文档指南 后,请随时贡献拉取请求。有疑问或建议要分享?前往 我们的社区论坛 与社区进行交流。