如何在Play中为两个不同的db定义Squeryl模式

时间:2014-01-19 21:10:18

标签: playframework-2.0 squeryl

我想在我们的Play 2.1应用程序中添加第二个临时数据库(基于文件的H2)。但无法弄清楚如何以及在何处为第二个DB创建Squeryl架构。

第一个模式已在扩展org.squeryl.Schema的scala类中定义。我应该在哪里为第二个DB提供表定义?

感谢任何提示。

2 个答案:

答案 0 :(得分:1)

我没有使用Play,所以你可能需要稍微调整一下才能使它工作,但你应该能够为该数据库创建一个新会话,如:

object MySecondDBSchema extends SquerylSchema with SchemaDefaults {
  def newSession[A](f: => A) =  {
    transaction(new org.squeryl.Session(//get java.sql.Connection, new H2Adapter)) {
      f
    }
  }

  val myTable = table[MyTable]
}

或者,如果您只是想要一个连接并计划自己处理交易。

def newSession[A](f: => A) =  {
  using(new org.squeryl.Session(//get java.sql.Connection, new H2Adapter)) {
    //start your own transaction
    f
  }
}

然后在您的代码中,当您想要访问其他数据库时,您可以将查询包装在:

def myMethodToAccessFirstDB() = {
  import MySecondDBSchema._

  newSession{ 
    //access alternate database
    from(myTable)(t => select(t)).toList 
  }
}

def myMethodToAccessDefaultDB() = {
  import DefaultSchema._ //Or whatever your default Schema is named

  //access default database
  from(otherTable)(ot => select(ot))
}

在扩展org.squeryl.Schema的第二个对象中定义和组织表是合乎逻辑的,但在newSession块中进行的任何查询都将针对第二个数据库执行。

至于覆盖name属性,这将更改默认schema in the database,但不是创建单独的Squeryl架构所必需的。

答案 1 :(得分:0)

除了jcern回答:不要忘记关闭连接。 我的变种:

object MySecondDBSchema extends Schema {

  var ds : DataSource = _

  def newSession[A](f: => A) = {
    var conn: Option[Connection] = None
    try {
      conn = Some(ds.getConnection)
      val proxyConn = conn.map {
        case a : ArraySupportProxyConnection => a
        case c : C3P0ProxyConnection => new ArraySupportProxyConnection(c)
      }.get
      using[A](new org.squeryl.Session(proxyConn, new AwesomePostgreSqlAdapter)) {
        inTransaction {
          f
        }
      }
    }
    finally {
      conn.foreach(_.close())
    }
  }

  ...
}