首页 > 解决方案 > 设置 Slick 3.xx 以在不同环境中使用不同的数据库

问题描述

我已经对我们的 Oracle 数据库运行 Slick 有一段时间了。现在我还想在我们的集成测试中将它用于 H2。我以为这只是关于更改正在加载的驱动程序,但现在我意识到我所有的存储库都充满了import slick.jdbc.OracleProfile.api._,这让我认为我的存储库此时与 OracleSQL 相关联。

让 Slick 支持基于不同配置文件加载 Oracle 或 H2 驱动程序的标准过程是什么?

标签: databasescalah2slick

解决方案


您需要通过 抽象 Slick 配置文件JdbcProfile。这将消除您确定为问题的特定于 Oracle 的部分。

听起来您有一个相当大的应用程序。在这种情况下,通常(根据我的经验)将 Slick 配置文件作为类或特征的参数,然后在您知道它是什么时传入特定的配置文件。

例如(使用Essential Slick中的示例代码)我们可以说我们的应用程序配置文件必须具有JdbcProfile

import slick.jdbc.JdbcProfile

trait Profile {
  val profile: JdbcProfile
}

然后,对于数据库代码的每个模块,我们导入配置文件 API:

trait DatabaseModule1 { self: Profile =>
  import profile.api._

  // Write database code here
}

请注意抽象profile.api._导入如何替换特定于数据库的slick.jdbc.OracleProfile.api._

如果您有许多模块,您可以将它们全部组合成一个案例类:

class DatabaseLayer(val profile: JdbcProfile) extends
  Profile with
  DatabaseModule1 with
  DatabaseModule2

最后,在程序的边缘,您可以决定使用什么配置:

object Main extends App {

  // At this point, you can make a test and decide which specific
  // database you want to use. Here I'm saying it's always H2:
  val databaseLayer = new DatabaseLayer(slick.jdbc.H2Profile)

  // You can now use methods in `databaseLayer`, 
  // or pass it to other modules in your system
}

这在以下中有进一步描述:


推荐阅读