代码之家  ›  专栏  ›  技术社区  ›  Joseph Lust

创建DatabaseConfigProvider的实现

  •  2
  • Joseph Lust  · 技术社区  · 8 年前

    我正在尝试测试一个Slick Play应用程序,而不必启动并通过Play Application上下文运行所有内容(使用H2)。这是因为我想共享H2连接,并在手头做很多测试DB准备。

    DatabaseConfigProvider 实施在这种情况下,我需要一个 JdbcProfile 配置。我要介绍的特点是:

    trait DatabaseConfigProvider {
      def get[P <: BasicProfile]: DatabaseConfig[P]
    }
    

    然而,我无法获得 数据库配置提供程序 的方法进行类型检查。

    class TestDbProvider(config:DatabaseConfig[JdbcProfile]) extends DatabaseConfigProvider {
      def get[P <: BasicProfile]: DatabaseConfig[P] = config
    }
    

    上述实现和许多其他变体都失败了。

    [error] RepositoryTest.scala:78: type mismatch;
    [error]  found   : slick.backend.DatabaseConfig[slick.driver.JdbcProfile]
    [error]  required: slick.backend.DatabaseConfig[P]
    [error]     def get[P <: BasicProfile]: DatabaseConfig[P] = config
    [error]                                                     ^
    [error] one error found
    [error] (api/test:compileIncremental) Compilation failed
    

    更多坏变体:

    // Fails
    class TestDbProvider(config:DatabaseConfig[JdbcProfile]) extends DatabaseConfigProvider {
      def get[P <: BasicProfile]: DatabaseConfig[JdbcProfile] = config
    }
    
    // Fails
    class TestDbProvider[P <: BasicProfile](config:DatabaseConfig[P]) extends DatabaseConfigProvider {
      def get[P]: DatabaseConfig[P] = config
    }
    
    // Fails
    class TestDbProvider(config:DatabaseConfig[JdbcProfile]) extends DatabaseConfigProvider {
      def get[JdbcProfile]: DatabaseConfig[JdbcProfile] = config
    }
    

    Scala实现 数据库配置提供程序 ? 纵观Slick/Play的代码基础,没有这样一个具体的实现示例。

    1 回复  |  直到 8 年前
        1
  •  1
  •   Joseph Lust    8 年前

    def toProvider(dbIn: PostgresDriver.backend.DatabaseDef) = {
    
        new DatabaseConfig[JdbcProfile] {
    
          override def db: JdbcProfile#Backend#Database = dbIn
          override def config: Config = None.orNull // unused
          override def driverIsObject: Boolean = true
          override def driverName: String = "org.postgresql.Driver"
          override val driver: JdbcProfile = ExtendedPostgresDriver
        }
    
        new DatabaseConfigProvider {
          // Cast is necessary, otherwise cannot get to compile
          override def get[P <: BasicProfile]: DatabaseConfig[P] = config.asInstanceOf[DatabaseConfig[P]]
        }
    }