让我们说如果下面有2个Schema。它们都在同一个MySQL服务器中。
问题是我无法在单个数据库run
中使用2个以上的架构操作。
如果我通过sql
执行这样的普通sql查询,它的工作没有任何问题。
def fooAction(name: String) = {
sql"""
SELECT AGE FROM MASTER.FOO_TABLE WHERE NAME = $name
""".as[String].head
}
def barAction(id: String) = {
sql"""
SELECT BAZ FROM BASE.BAR_TABLE WHERE ID = $id
""".as[String].head
}
def execute = {
//It doesn't matter which Db I use in here But Let's say this baseDb is pointing to BASE schema.
baseDb.run(for{
foo <- fooAction("sample")
bar <- barAction("sample")
} yield foo + bar)
}
但代码打击的情况并非
class FooTableDAO @Inject() (@NamedDatabase("master") protected val dbConfigProvider: DatabaseConfigProvider) extends HasDatabaseConfigProvider[JdbcProfile] {
import dbConfig.driver.api._
val table = TableQuery[FooTable]
def fooAction(name: String) = table.filter{_.name == name}.map{_.age}.result.head
}
class BarTableDAO @Inject() (@NamedDatabase("base") protected val dbConfigProvider: DatabaseConfigProvider) extends HasDatabaseConfigProvider[JdbcProfile] {
import dbConfig.driver.api._
val table = TableQuery[BarTable]
def fooAction(id: String) = table.filter{_.id == id}.map{_.baz}.result.head
}
def execute = {
//com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'BASE.FOO_TABLE' doesn't exist
baseDb.run(for{
foo <- fooTableDAO.fooAction("sample")
bar <- barTableDAO.barAction("sample")
} yield foo + bar)
}
由于baseDb
指向BASE架构,它会尝试在MASTER架构中查找FOO_TABLE
。所有我想要做的是为每个查询使用不同的模式,但我找不到方法。
目前我做DBIO.from(db.run(**))
如果在理解DBIO操作时需要另一个模式操作,或者通过run
执行每个操作并用EitherT
包装,这是scala库名为{ {1}} {/ 1}}的monad变换器继续使用for-comprehension。
除了使用纯文本查询外,有没有办法在单个DBIO Action中处理2个以上的模式?
提前致谢。
答案 0 :(得分:1)
我认为(虽然我不是MySQL专家)你的意思是schema
,而不是database
。至少这是我从你的SQL
样本中看到的。
您不能只在Slick
表映射中使用 schema 属性吗?在这里,您可以获得使用不同模式的完整答案:https://stackoverflow.com/a/41090987/2239369
以下是相关的代码:
class StudentTable(tag: Tag) extends Table[Student](tag, _schemaName = Option("database2"), "STUDENT") {
...
}
(注意_schemaName
属性)。
考虑到这一部分的问题:
除了使用纯文本查询外,有没有办法在单个DBIO Action中处理2个以上的模式?
是:是的,你可以。