【问题标题】:Use multiple DB / Schema in a single DBIO in Slick在 Slick 的单个 DBIO 中使用多个 DB / Schema
【发布时间】:2026-01-30 16:10:01
【问题描述】:

假设我在下面有 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 操作时需要另一个模式操作,或者通过 run 执行每个操作并用 EitherT 包装它们,我会执行 DBIO.from(db.run(**)),这是名为 cats 的 monad 转换器的 scala 库让Either继续使用for-comprehension。

除了使用纯文本查询之外,还有什么方法可以在单个 DBIO 操作中处理超过 2 个模式?

提前致谢。

【问题讨论】:

  • 你能不能也提供光滑的版本
  • @user2829759 这是使用 slick 3.1 的 play-slick 2.0

标签: mysql scala slick play-slick


【解决方案1】:

我认为(尽管我不是 MySQL 专家)您的意思是 schema,而不是 database。至少这是我从您的SQL 样本中看到的。

你不能在Slick 表映射中使用 schema 属性吗?在这里你有使用不同模式的完整答案:https://*.com/a/41090987/2239369

以下是相关代码:

class StudentTable(tag: Tag) extends Table[Student](tag, _schemaName = Option("database2"), "STUDENT") {
    ...
}

(注意_schemaName 属性)。

考虑到这一点,回答这部分问题:

除了使用纯文本查询之外,还有什么方法可以在单个 DBIO Action 中处理超过 2 个模式?

是:是的,你可以。

【讨论】:

  • 感谢您的信息。这正是我想知道的。仅供参考,数据库和模式在 MySQL 中的含义相同。 *.com/questions/11618277/…