Playframework 2.0 如何为两个不同的数据库定义Squeryl模式
我想在Play 2.1应用程序中添加第二个临时DB(基于文件的H2)。但无法找出如何以及在何处为第二个数据库创建Squeryl模式 第一个模式已经在扩展org.squeryl.schema的scala类中定义。第二个DB的表定义应该放在哪里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,因此您可能需要对其进行一些调整以使其正常工作,但您应该能够为该数据库创建一个新会话,例如:
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,我更新了示例,提供了一个更完整的示例。如果这更有意义,请告诉我。谢谢!那正是我要找的。不知何故,我没有意识到我可以为表使用适当的导入或完全限定的名称。回答接受!