PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Các tệp phát triển Playframework tương thích với cả postgres và h2

Tôi biết đây là một bài viết cũ hơn, nhưng có vẻ như vẫn chưa có giải pháp rõ ràng trong một vài năm sau đó. như một bản sửa lỗi ngắn hạn, trong lần chơi 2.4.x-2.5.x (cho đến nay mới chỉ được thử nghiệm ở đó), bạn có thể thay đổi cách áp dụng các diễn biến trong quá trình thử nghiệm bằng cách tạo trình đọc diễn biến tùy chỉnh:

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))
}

sau đó chuyển nó vào nơi bạn áp dụng các tiến trình trong quá trình thử nghiệm của mình:

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

lưu ý rằng trình đọc vẫn ở trong trạng thái khá ngu ngốc (giả định rằng các câu lệnh SQL là một dòng, điều này không được đảm bảo), nhưng điều này sẽ đủ để mọi người bắt đầu.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. pg-promise:sử dụng kết quả của một truy vấn trong truy vấn tiếp theo trong một giao dịch

  2. Cách thực hiện Kiểm toán / lập phiên bản các Sửa đổi Bảng trên PostgreSQL

  3. Số tiền kiểm tra kích hoạt Postgres trước khi xóa

  4. PESSIMISTIC_WRITE có khóa toàn bộ bảng không?

  5. Làm thế nào để thả nhiều (nhưng không phải tất cả) bảng trong một lần rơi?