Playframework 2.0 如何为两个不同的数据库定义Squeryl模式

Playframework 2.0 如何为两个不同的数据库定义Squeryl模式,playframework-2.0,squeryl,Playframework 2.0,Squeryl,我想在Play 2.1应用程序中添加第二个临时DB(基于文件的H2)。但无法找出如何以及在何处为第二个数据库创建Squeryl模式 第一个模式已经在扩展org.squeryl.schema的scala类中定义。第二个DB的表定义应该放在哪里 谢谢您的提示。我没有使用Play,因此您可能需要对其进行一些调整以使其正常工作,但您应该能够为该数据库创建一个新会话,例如: object MySecondDBSchema extends SquerylSchema with SchemaDefaults

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

第一个模式已经在扩展org.squeryl.schema的scala类中定义。第二个DB的表定义应该放在哪里


谢谢您的提示。

我没有使用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
属性,这将更改默认值,但对于创建单独的Squeryl模式不是必需的

除了回答:别忘了关闭连接。 我的变体:

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

  ...
}

通过深入研究,我在Squeryl Google组中发现了一个提示:-我想我需要创建一个不同的Schema类并重写Schema.name属性。仍然不确定如何告诉Squeryl使用哪个模式来做什么DB@jcem-谢谢。我的问题是创建第二个模式并将该模式绑定到第二个DB,而不是会话。我大致算出了会议的部分。在任何情况下,为每个H2查询创建一个新会话是一种好的做法吗?我是否应该把它缓存在某个地方(比如在游戏缓存中)?对不起,我可能已经理解了。是否要在现有数据库上创建第二个架构,例如:
db.schema1.tablename
db.schema2.tablename
,还是希望与现有数据库一起使用第二个单独的数据库?如果是后者,那么我发布的内容将适用。如果是前者,那么您的思路是正确的——您只需根据表定义导入Squeryl模式和查询(只需注意名称空间冲突)。这个问题似乎提到了两个独立的数据库,这就是我回答问题的原因。@jcem:后者是一个独立的数据库和现有的数据库。第二个数据库应该具有完全不同的模式。我仍然不知道如何告诉Squiryl为第二个DB使用另一个
Schema
类。@Alex,我更新了示例,提供了一个更完整的示例。如果这更有意义,请告诉我。谢谢!那正是我要找的。不知何故,我没有意识到我可以为表使用适当的导入或完全限定的名称。回答接受!