sql >> データベース >  >> RDS >> PostgreSQL

postgresとh2の両方と互換性のあるPlayframework進化ファイル

    私はこれが古い投稿であることを知っていますが、数年後もまだ明らかな解決策がないようです。短期的な修正として、play 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ステートメントがワンライナーであると想定していますが、これは保証されていません)が、これで誰でも始めることができます。



    1. ORACLEAPEX-テキストフィールドに入力するボタンを設定します

    2. mysqlは同じnow()で複数の列を更新します

    3. Mytop –LinuxでMySQL/MariaDBのパフォーマンスを監視するための便利なツール

    4. Oracleで数字をローマ数字としてフォーマットする方法