如何在ScalaQuery中回滚会话?

ton*_*ian 9 sql scala scalaquery

对于我的单元测试,我想设置一个数据库,用基本信息填充它,并在会话中运行每个测试,以回滚对数据库所做的所有更改,以便始终为每个测试提供一个原始副本.

我正在寻找类似的东西

db withSession {
   <create my objects under test>
   <run operations>
   <run asserts>

   this.rollback()
}
Run Code Online (Sandbox Code Playgroud)

回滚功能是在Scala Query的早期版本中,但它现在似乎缺失了.我该如何实现此功能?

最好的祝福

ton*_*ian 2

这是一个说明此行为的单元测试

https://github.com/szeiger/scala-query/blob/master/src/test/scala/org/scalaquery/test/TransactionTest.scala

GitHub 目前该链接出现 404 错误,但我从 google 缓存中提取了源代码:

package org.scalaquery.test

import org.junit.Test
import org.junit.Assert._
import org.scalaquery.ql._
import org.scalaquery.ql.extended.{ExtendedTable => Table}
import org.scalaquery.session.Database.threadLocalSession
import org.scalaquery.test.util._
import org.scalaquery.test.util.TestDB._

object TransactionTest extends DBTestObject(H2Disk, SQLiteDisk, Postgres, MySQL, DerbyDisk, HsqldbDisk, MSAccess, SQLServer)
class TransactionTest(tdb: TestDB) extends DBTest(tdb) {
  import tdb.driver.Implicit._

  @Test def test() {

    val T = new Table[Int]("t") {
      def a = column[Int]("a")
      def * = a
    }

    db withSession {
      T.ddl.create
    }

    val q = Query(T)

    db withSession {
      threadLocalSession withTransaction {
        T.insert(42)
        assertEquals(Some(42), q.firstOption)
        threadLocalSession.rollback()
      }
      assertEquals(None, q.firstOption)
    }
  }
}
Run Code Online (Sandbox Code Playgroud)