sql-server - 由于带有 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"
如何解决这个问题?
解决方案
经过一些研究和反复试验,结果发现我需要在连接字符串中指定数据库名称并标记模式名称。
因此,从我上面的代码中,我需要将其更改为:
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"
)
推荐阅读
- javascript - HTML - 删除 iframe 显示
- go - gosec 无法找到导入目录
- python - 寻找一种更 Pythonic 的方式将一个充满字典的列表合并为一个?
- javascript - 仅更新 Safari 时反应顺序丢失
- ios - 如何在 SwiftUI 中将 LocalizedStringKey 更改为 String
- html - 引导模式(点击按钮根本不起作用)
- lua - 如何在 Luvit repl 命令提示符下执行代码或可执行 .lua 文件?
- android - FirebaseAuth - 来自此 Android 客户端应用程序的请求
被封锁 - r - 如何进一步融合数据集?
- php - Laravel 6-7 如何覆盖/更改供应商类?