Playframework 进化文件与 postgres 和 h2 兼容

2024-03-18

我一直在使用 H2 作为后端,使用 Play 框架 (scala) 开发一个网站。测试集成得很好,尤其是能够针对内存中的 H2 数据库运行测试。

现在,出于各种方便的原因,我想将我的数据存储转移到 Postgres。这给我留下了一个问题:如何继续测试并为每次测试运行保留新鲜数据库的简单性?我在网上看到有些人设法针对 postgres 实时运行并针对 H2 进行测试。然而,两者在 SQL 级别并不完全兼容(即使在 Postgres 兼容模式下使用 H2)。例如,H2 不支持 SERIAL、BIGSERIAL 和 BYTEA。

我可以通过使用两种方言的受限兼容交集来做到这一点,还是我缺少另一种技术?

谢谢你的帮助。

Alex


我知道这是一篇较旧的帖子,但几年后似乎还没有明显的解决方案。作为短期修复,在 2.4.x-2.5.x 中(到目前为止仅在其中进行了测试),您可以通过创建自定义进化阅读器来改变测试期间应用进化的方式:

package support

import play.api.db.evolutions.{ClassLoaderEvolutionsReader, Evolutions, ResourceEvolutionsReader}

import java.io.{ByteArrayInputStream, InputStream}
import java.nio.charset.StandardCharsets
import scala.io.Source
import scala.util.Try

class EvolutionTransformingReader(
    classLoader: ClassLoader = classOf[ClassLoaderEvolutionsReader].getClassLoader,
    prefix: String = "")
  extends ResourceEvolutionsReader {

  def loadResource(db: String, revision: Int): Option[InputStream] =
    for {
      stream <- Option(classLoader.getResourceAsStream(prefix + Evolutions.resourceName(db, revision)))
      lines <- Try(Source.fromInputStream(stream).getLines).toOption
      updated = lines map convertPostgresLinesToH2
    } yield convertLinesToInputStream(updated)

  private val ColumnRename = """(?i)\s*ALTER TABLE (\w+) RENAME COLUMN (\w+) TO (\w+);""".r

  private def convertPostgresLinesToH2(line: String): String =
    line match {
      case ColumnRename(tableName, oldColumn, newColumn) =>
        s"""ALTER TABLE $tableName ALTER COLUMN $oldColumn RENAME TO $newColumn;"""
      case _ => line
    }

  private def convertLinesToInputStream(lines: Iterator[String]): InputStream =
    new ByteArrayInputStream(lines.mkString("\n").getBytes(StandardCharsets.UTF_8))
}

然后将其传递到您在测试期间应用进化的地方:

Evolutions.applyEvolutions(registry.database, new EvolutionTransformingReader())

请注意,读者仍然处于相当愚蠢的状态(它假设 SQL 语句是单行语句,这不能保证),但这应该足以让任何人开始。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Playframework 进化文件与 postgres 和 h2 兼容 的相关文章

随机推荐