在Slick

时间:2017-01-24 05:05:52

标签: mysql scala slick play-slick

让我们说如果下面有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个以上的模式?

提前致谢。

1 个答案:

答案 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个以上的模式?

是:是的,你可以。