ScalikeJDBC 不会连接到 NamedDB 以在 ScalaTest 测试用例中进行 DSL 查询

ScalikeJDBC won't connect to NamedDB for DSL queries in ScalaTest test cases

我在为我的 ScalaTest 测试用例使用测试数据库时遇到了麻烦,如 documentation examples.

中所示

我有一个默认数据库和一个 testdb 数据库,我的规范看起来像

class JobSpec extends FlatSpec with AutoRollback {
  DBsWithEnv("test").setup('testdb)
  override def db = NamedDB('testdb).toDB

  override def fixture(implicit session:DBSession) = {
    User.insert("test_user")
  }

  it should "create a new user" in { implicit session: DBSession =>
    User.sqlFind("test_user") //succeeds
    User.dslFind("test_user") //fails
  }
}

似乎我使用 sql 的查询有效,但使用 dsl 的查询无效。 DSL 查询错误,试图访问 'default 数据库,但 sql 查询正确使用 'testdb 数据库。这是错误

Connection pool is not yet initialized.(name:'default)
java.lang.IllegalStateException: Connection pool is not yet initialized.(name:'default)

这是用户 class

case class User(name: String)
object User extends SQLSyntaxSupport[User] {
  def apply(u: SyntaxProvider[User])(rs: WrappedResultSet) = apply(u.resultName)(rs)
  def apply(j: ResultName[User])(rs: WrappedResultSet) = new User(rs.get(u.name))

  override val tableName = "users"
  val u = User.syntax("u")

  def dslFind(name: String)(implicit session: DBSession) = 
    withSQL {
      select.from(User as u).where.eq(u.name, name)
    }.map(User(u)).single().apply()
  def sqlFind(name: String)(implicit session: DBSession) = 
    sql""" select (name) from users where name = $name;"""
      .map(rs => new User(rs.string(1)).single().apply()
}

有人知道为什么在调用 DSL 创建的查询时尝试使用默认数据库而不是 testdb 吗?谢谢!

您需要像这样覆盖 SQLSyntaxSupport:

override val connectionPoolName = 'testdb

原因是 SQLSyntaxSupport 在第一次访问时从 JDBC 元数据中获取列。

http://scalikejdbc.org/documentation/sql-interpolation.html

如果您希望避免自动访问元数据,请覆盖列或使用 autoColumns 宏。

https://github.com/scalikejdbc/scalikejdbc/blob/2.2.8/scalikejdbc-syntax-support-macro/src/test/scala/foo/AutoSpec.scala#L20