首页 > 解决方案 > 由于带有 SQL Server 配置文件的 Slick 中的表名周围有双引号,因此无法执行查询

问题描述

我将 Slick 与 SQL Server 配置文件一起使用。我遇到以下错误:

Exception in thread "main" java.sql.SQLException: Invalid object name 'application.sch.place_table'.

尝试执行时TableQuery.result(参见exec1下面的代码)。但是,这不会发生在普通 SQL 中(参见exec2下面的代码)。

case class Source(rowId: Long, placeId: Int)

class SourceTable(tag: Tag) extends Table[Source](tag, "application.sch.place_table") {
  def rowId = column[Long]("RowID")
  def placeId = column[Int]("place_id")

  def * = (rowId, placeId).mapTo[Source]
}

object SlickTest extends App {

  val db: SQLServerProfile.backend.DatabaseDef =
    Database.forURL(
      url = "jdbc:jtds:sqlserver://localhost:3000/place_db",
      user = "user",
      password = "user123",
      driver = "slick.jdbc.SQLServerProfile"
    )

  lazy val sources = TableQuery[SourceTable]

  val exec1 = Await.result(
      db.run(sources.result), Duration.create(1, TimeUnit.MINUTES)
  ) // NOT OK

  val exec2 = Await.result(
    db.run {
      sql"""SELECT "RowID", "place_id" FROM application.sch.place_table """
        .as[(Long, Int)]
    },
    Duration.create(1, TimeUnit.MINUTES)
  ) // OK
}

似乎这个问题是因为生成的 SQLTableQuery的表名用双引号括起来,即

println(sources.result.statment.mkString) //select "RowID", "place_id" from "application.sch.place_table"

如何解决这个问题?

标签: sql-serverscalaslick

解决方案


经过一些研究和反复试验,结果发现我需要在连接字符串中指定数据库名称并标记模式名称。

因此,从我上面的代码中,我需要将其更改为:

class SourceTable(tag: Tag) extends Table[Source](tag, Some("sch"), "place_table")

  val db: SQLServerProfile.backend.DatabaseDef =
    Database.forURL(
      url = "jdbc:jtds:sqlserver://localhost:3000/place_db;databaseName=application",
      user = "user",
      password = "user123",
      driver = "slick.jdbc.SQLServerProfile"
    )

推荐阅读